Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
892768447 committed Dec 28, 2018
1 parent 880fc81 commit 305efd6
Show file tree
Hide file tree
Showing 31 changed files with 9,436 additions and 0 deletions.
Empty file added QFlowLayout/Lib/__init__.py
Empty file.
161 changes: 161 additions & 0 deletions QFlowLayout/Lib/flowlayout.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#!/usr/bin/env python


#############################################################################
##
# Copyright (C) 2013 Riverbank Computing Limited.
# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
##
# This file is part of the examples of PyQt.
##
# $QT_BEGIN_LICENSE:BSD$
# You may use this file under the terms of the BSD license as follows:
##
# "Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
# the names of its contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
##
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
# $QT_END_LICENSE$
##
#############################################################################


from PyQt5.QtCore import QPoint, QRect, QSize, Qt
from PyQt5.QtWidgets import (QApplication, QLayout, QPushButton, QSizePolicy,
QWidget)


class Window(QWidget):
def __init__(self):
super(Window, self).__init__()

flowLayout = FlowLayout()
flowLayout.addWidget(QPushButton("Short"))
flowLayout.addWidget(QPushButton("Longer"))
flowLayout.addWidget(QPushButton("Different text"))
flowLayout.addWidget(QPushButton("More text"))
flowLayout.addWidget(QPushButton("Even longer button text"))
self.setLayout(flowLayout)

self.setWindowTitle("Flow Layout")


class FlowLayout(QLayout):
def __init__(self, parent=None, margin=0, spacing=-1):
super(FlowLayout, self).__init__(parent)

if parent is not None:
self.setContentsMargins(margin, margin, margin, margin)

self.setSpacing(spacing)

self.itemList = []

def __del__(self):
item = self.takeAt(0)
while item:
item = self.takeAt(0)

def addItem(self, item):
self.itemList.append(item)

def count(self):
return len(self.itemList)

def itemAt(self, index):
if index >= 0 and index < len(self.itemList):
return self.itemList[index]

return None

def takeAt(self, index):
if index >= 0 and index < len(self.itemList):
return self.itemList.pop(index)

return None

def expandingDirections(self):
return Qt.Orientations(Qt.Orientation(0))

def hasHeightForWidth(self):
return True

def heightForWidth(self, width):
height = self.doLayout(QRect(0, 0, width, 0), True)
return height

def setGeometry(self, rect):
super(FlowLayout, self).setGeometry(rect)
self.doLayout(rect, False)

def sizeHint(self):
return self.minimumSize()

def minimumSize(self):
size = QSize()

for item in self.itemList:
size = size.expandedTo(item.minimumSize())

margin, _, _, _ = self.getContentsMargins()

size += QSize(2 * margin, 2 * margin)
return size

def doLayout(self, rect, testOnly):
x = rect.x()
y = rect.y()
lineHeight = 0

for item in self.itemList:
wid = item.widget()
spaceX = self.spacing() + wid.style().layoutSpacing(QSizePolicy.PushButton,
QSizePolicy.PushButton, Qt.Horizontal)
spaceY = self.spacing() + wid.style().layoutSpacing(QSizePolicy.PushButton,
QSizePolicy.PushButton, Qt.Vertical)
nextX = x + item.sizeHint().width() + spaceX
if nextX - spaceX > rect.right() and lineHeight > 0:
x = rect.x()
y = y + lineHeight + spaceY
nextX = x + item.sizeHint().width() + spaceX
lineHeight = 0

if not testOnly:
item.setGeometry(QRect(QPoint(x, y), item.sizeHint()))

x = nextX
lineHeight = max(lineHeight, item.sizeHint().height())

return y + lineHeight - rect.y()


if __name__ == '__main__':

import sys

app = QApplication(sys.argv)
mainWin = Window()
mainWin.show()
sys.exit(app.exec_())
56 changes: 56 additions & 0 deletions QGraphicsDropShadowEffect/Lib/AnimationShadowEffect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2018年9月25日
@author: Irony
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
@file: AnimationShadowEffect
@description: 边框动画阴影动画
"""
from PyQt5.QtCore import QPropertyAnimation, pyqtProperty
from PyQt5.QtWidgets import QGraphicsDropShadowEffect


__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0


class AnimationShadowEffect(QGraphicsDropShadowEffect):

def __init__(self, color, *args, **kwargs):
super(AnimationShadowEffect, self).__init__(*args, **kwargs)
self.setColor(color)
self.setOffset(0, 0)
self.setBlurRadius(0)
self._radius = 0
self.animation = QPropertyAnimation(self)
self.animation.setTargetObject(self)
self.animation.setDuration(2000) # 一次循环时间
self.animation.setLoopCount(-1) # 永久循环
self.animation.setPropertyName(b'radius')
# 插入值
self.animation.setKeyValueAt(0, 1)
self.animation.setKeyValueAt(0.5, 30)
self.animation.setKeyValueAt(1, 1)

def start(self):
self.animation.start()

def stop(self, r=0):
# 停止动画并修改半径值
self.animation.stop()
self.radius = r

@pyqtProperty(int)
def radius(self):
return self._radius

@radius.setter
def radius(self, r):
self._radius = r
self.setBlurRadius(r)
Empty file.
Loading

0 comments on commit 305efd6

Please sign in to comment.