每天学习一个小例子———原资源已经上传了

来源:

https://pyqt.site , https://github.com/PyQt5

1    按钮底部线条进度

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2018年2月1日
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: PushButtonLine
@description: 
"""

import sys
from random import randint

try:
    from PyQt5.QtCore import QTimer, QThread, pyqtSignal
    from PyQt5.QtGui import QPainter, QColor, QPen
    from PyQt5.QtWidgets import QPushButton, QApplication, QWidget, QVBoxLayout
except ImportError:
    from PySide2.QtCore import QTimer, QThread, Signal as pyqtSignal
    from PySide2.QtGui import QPainter, QColor, QPen
    from PySide2.QtWidgets import QPushButton, QApplication, QWidget, QVBoxLayout

StyleSheet = '''
PushButtonLine {
    color: white;
    border: none;
    min-height: 48px;
    background-color: #90caf9;
}
'''


class LoadingThread(QThread):
    valueChanged = pyqtSignal(float)  # 当前值/最大值

    def __init__(self, *args, **kwargs):
        super(LoadingThread, self).__init__(*args, **kwargs)
        self.totalValue = randint(100, 200)  # 模拟最大

    def run(self):
        for i in range(self.totalValue + 1):
            if self.isInterruptionRequested():
                break
            self.valueChanged.emit(i / self.totalValue)
            QThread.msleep(randint(50, 100))


class PushButtonLine(QPushButton):
    lineColor = QColor(0, 150, 136)

    def __init__(self, *args, **kwargs):
        self._waitText = kwargs.pop("waitText", "等待中")
        super(PushButtonLine, self).__init__(*args, **kwargs)
        self._text = self.text()
        self._percent = 0
        self._timer = QTimer(self, timeout=self.update)
        self.clicked.connect(self.start)

    def __del__(self):
        self.stop()

    def paintEvent(self, event):
        super(PushButtonLine, self).paintEvent(event)
        if not self._timer.isActive():
            return
        # 画进度
        painter = QPainter(self)
        pen = QPen(self.lineColor)
        pen.setWidth(4)
        painter.setPen(pen)
        painter.drawLine(0, self.height(), self.width()
                         * self._percent, self.height())

    def start(self):
        if hasattr(self, "loadingThread"):
            return self.stop()
        self.loadingThread = LoadingThread(self)
        self.loadingThread.valueChanged.connect(self.setPercent)
        self._timer.start(100)  # 100ms
        self.loadingThread.start()
        self.setText(self._waitText)

    def stop(self):
        try:
            if hasattr(self, "loadingThread"):
                if self.loadingThread.isRunning():
                    self.loadingThread.requestInterruption()
                    self.loadingThread.quit()
                    self.loadingThread.wait(2000)
                del self.loadingThread
        except RuntimeError:
            pass
        try:
            self._percent = 0
            self._timer.stop()
            self.setText(self._text)
        except RuntimeError:
            pass

    def setPercent(self, v):
        self._percent = v
        if v == 1:
            self.stop()
            self.update()

    def setLineColor(self, color):
        self.lineColor = QColor(color)
        return self


class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        layout = QVBoxLayout(self)
        layout.addWidget(PushButtonLine("点击加载"))
        layout.addWidget(PushButtonLine("点击加载").setLineColor("#ef5350"))
        layout.addWidget(PushButtonLine("点击加载").setLineColor("#ffc107"))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = Window()
    w.show()
    sys.exit(app.exec_())

 2   按钮文字旋转进度

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2018年2月1日
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: PushButtonFont
@description: 
"""

import sys

try:
    from PyQt5.QtCore import QPropertyAnimation, Qt, QRectF
    from PyQt5.QtGui import QFontDatabase
    from PyQt5.QtWidgets import QPushButton, QApplication, QStyleOptionButton, \
        QStylePainter, QStyle
except ImportError:
    from PySide2.QtCore import QPropertyAnimation, Qt, QRectF
    from PySide2.QtGui import QFontDatabase
    from PySide2.QtWidgets import QPushButton, QApplication, QStyleOptionButton, \
        QStylePainter, QStyle


class PushButtonFont(QPushButton):
    LoadingText = "\uf110"

    def __init__(self, *args, **kwargs):
        super(PushButtonFont, self).__init__(*args, **kwargs)
        self.fontSize = self.font().pointSize() * 2
        self._rotateAnimationStarted = False
        self._rotateAnimation = QPropertyAnimation(self)
        self._rotateAnimation.setTargetObject(self)
        self._rotateAnimation.setStartValue(1)
        self._rotateAnimation.setEndValue(12)
        self._rotateAnimation.setDuration(1000)
        self._rotateAnimation.setLoopCount(-1)  # 无限循环
        self._rotateAnimation.valueChanged.connect(self.update)
        self.clicked.connect(self._onClick)

    def paintEvent(self, _):
        option = QStyleOptionButton()
        self.initStyleOption(option)
        painter = QStylePainter(self)
        if self._rotateAnimationStarted:
            option.text = ""
        painter.drawControl(QStyle.CE_PushButton, option)
        if not self._rotateAnimationStarted:
            return
        painter.save()
        font = self.font()
        font.setPointSize(self.fontSize)
        font.setFamily("FontAwesome")
        painter.setFont(font)
        # 变换坐标为正中间
        painter.translate(self.rect().center())
        # 旋转90度
        painter.rotate(self._rotateAnimation.currentValue() * 30)
        fm = self.fontMetrics()
        # 在变换坐标后的正中间画文字
        w = fm.width(self.LoadingText)
        h = fm.height()
        painter.drawText(
            QRectF(0 - w * 2, 0 - h, w * 2 * 2, h * 2), Qt.AlignCenter,
            self.LoadingText)
        painter.restore()

    def _onClick(self):
        if self._rotateAnimationStarted:
            self._rotateAnimationStarted = False
            self._rotateAnimation.stop()
            return
        self._rotateAnimationStarted = True
        self._rotateAnimation.start()

    def update(self, _=None):
        super(PushButtonFont, self).update()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 加载字体到字体库中
    QFontDatabase.addApplicationFont(
        "Data/Fonts/FontAwesome/fontawesome-webfont.ttf")
    w = PushButtonFont("点击加载")
    w.resize(400, 400)
    w.show()
    sys.exit(app.exec_())

 3    普通样式

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2018年1月29日
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: NormalStyle
@description: 
"""

import sys

try:
    from PyQt5.QtWidgets import QWidget, QHBoxLayout, QPushButton, QApplication
except ImportError:
    from PySide2.QtWidgets import QWidget, QHBoxLayout, QPushButton, QApplication

StyleSheet = """
/*这里是通用设置,所有按钮都有效,不过后面的可以覆盖这个*/
QPushButton {
    border: none; /*去掉边框*/
}

/*
QPushButton#xxx
或者
#xx
都表示通过设置的objectName来指定
*/
QPushButton#RedButton {
    background-color: #f44336; /*背景颜色*/
}
#RedButton:hover {
    background-color: #e57373; /*鼠标悬停时背景颜色*/
}
/*注意pressed一定要放在hover的后面,否则没有效果*/
#RedButton:pressed {
    background-color: #ffcdd2; /*鼠标按下不放时背景颜色*/
}

#GreenButton {
    background-color: #4caf50;
    border-radius: 5px; /*圆角*/
}
#GreenButton:hover {
    background-color: #81c784;
}
#GreenButton:pressed {
    background-color: #c8e6c9;
}

#BlueButton {
    background-color: #2196f3;
    /*限制最小最大尺寸*/
    min-width: 96px;
    max-width: 96px;
    min-height: 96px;
    max-height: 96px;
    border-radius: 48px; /*圆形*/
}
#BlueButton:hover {
    background-color: #64b5f6;
}
#BlueButton:pressed {
    background-color: #bbdefb;
}

#OrangeButton {
    max-height: 48px;
    border-top-right-radius: 20px; /*右上角圆角*/
    border-bottom-left-radius: 20px; /*左下角圆角*/
    background-color: #ff9800;
}
#OrangeButton:hover {
    background-color: #ffb74d;
}
#OrangeButton:pressed {
    background-color: #ffe0b2;
}

/*根据文字内容来区分按钮,同理还可以根据其它属性来区分*/
QPushButton[text="purple button"] {
    color: white; /*文字颜色*/
    background-color: #9c27b0;
}
"""


class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        layout = QHBoxLayout(self)
        layout.addWidget(QPushButton("red button", self,
                                     objectName="RedButton", minimumHeight=48))
        layout.addWidget(QPushButton("green button", self,
                                     objectName="GreenButton", minimumHeight=48))
        layout.addWidget(QPushButton("blue button", self,
                                     objectName="BlueButton", minimumHeight=48))
        layout.addWidget(QPushButton("orange button", self,
                                     objectName="OrangeButton", minimumHeight=48))
        layout.addWidget(QPushButton("purple button", self,
                                     objectName="PurpleButton", minimumHeight=48))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = Window()
    w.show()
    sys.exit(app.exec_())

 4    按钮常用信号

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2019年7月2日
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: QPushButton.SignalsExample
@description: 按钮信号例子
"""

try:
    from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QPlainTextEdit
except ImportError:
    from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QPlainTextEdit


class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        layout = QVBoxLayout(self)

        btn1 = QPushButton('按钮点击信号', self)
        btn1.setObjectName('ClickBtn')
        btn1.clicked.connect(self.onClicked)
        layout.addWidget(btn1)

        btn2 = QPushButton('按钮按下信号', self)
        btn2.setObjectName('PressBtn')
        btn2.pressed.connect(self.onPressed)
        layout.addWidget(btn2)

        btn3 = QPushButton('按钮释放信号', self)
        btn3.setObjectName('ReleaseBtn')
        btn3.released.connect(self.onReleased)
        layout.addWidget(btn3)

        btn4 = QPushButton('按钮释放信号', self)
        btn4.setObjectName('ToggleBtn')
        btn4.setCheckable(True)
        btn4.toggled.connect(self.onToggled)
        layout.addWidget(btn4)

        self.resultView = QPlainTextEdit(self)
        self.resultView.setReadOnly(True)
        layout.addWidget(self.resultView)

    def onClicked(self):
        self.resultView.appendPlainText(
            '按钮{0}被点击'.format(self.sender().objectName()))

    def onPressed(self):
        self.resultView.appendPlainText(
            '按钮{0}被按下'.format(self.sender().objectName()))

    def onReleased(self):
        self.resultView.appendPlainText(
            '按钮{0}被释放'.format(self.sender().objectName()))

    def onToggled(self, checked):
        self.resultView.appendPlainText(
            '按钮{0}被选中:{1}'.format(self.sender().objectName(), checked))


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

 


版权声明:本文为qq_42046837原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42046837/article/details/121220786