这个是我们程序的框架,下面介绍的函数可以往函数ui里添加做测试。

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def  __init__(self):
        super().__init__()
        self.setWindowTitle("ABCDE")
        self.resize(500, 500)
        self.ui()
    def ui(self):
        obj = QObject()
        #往里面添加内容

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

一、对象名称、属性

setObjectName("唯一名称")

给Qt对象设置名字,一般这个名字是唯一的,当作ID使用。       

setProperty("属性名称",值)

给一个Qt对象动态的 

objectName()

获取一个Qt对象的名称。

property("属性名称")

获取一个对象的属性值。

dynamicPropertyNames()

获取一个对象中所有通过setProperty()设置的属性名称。

应用场景

  1. 用于qss的ID选择器,属性选择器,方便统一格式。
  2. 用于装饰器的信号与槽。

应用案例

案例:创建多个用于信息提示的QLable,信息提示分三个级别:正常、警告、错误。

qss文件:

QLabel#notice {
    font-size: 40px;
    color: gray;
    border: 1px solid gray;
    border-radius: 10px;
}
QLabel#notice[notice_level="normal"] {
    color: green;
    border-color: green;
}
QLabel#notice[notice_level="warning"] {
    color: orange;
    border-color: orange;
}
QLabel#notice[notice_level="error"] {
    color: red;
    border-color: red;
}

py文件:

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def  __init__(self):
        super().__init__()
        self.setWindowTitle("Qobject的应用")
        self.resize(500, 500)
        self.ui()
    def ui(self):
        #使用qss
        with open("Qobject.qss", "r") as f:
            qApp.setStyleSheet(f.read())
        #第一个QLabel
        label = QLabel(self)
        label.setObjectName("notice")#设置ID
        label.setProperty("notice_level","normal")#设置属性与值
        label.setText("Normal")
        # 第二个QLabel
        label2 = QLabel(self)
        label2.move(0,100)
        label2.setObjectName("notice")
        label2.setProperty("notice_level", "warning")
        label2.setText("Warning")
        # 第三个QLabel
        label3 = QLabel(self)
        label3.move(0, 200)
        label3.setObjectName("notice")
        label3.setProperty("notice_level", "error")
        label3.setText("Error")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

效果:

Python qt5的多级菜单用什么控件_信号与槽


二、对象的父子关系

setParent(parent)

设置父对象。

parent()

获取父对象。

chidren()

获取所有直接子对象。

findChild(参数1,参数2,参数3)

获取一个指定名称或类型的子对象,参数1:类型QObject;参数2:通过setObjectName函数设置的名字;参数3:默认是递归查找,另一种是只查找直接子对象[Qt.FindDirectChildrenOnly]

findChildren(参数1,参数2,参数3)

获取多个指定名称或类型的子对象


三、信号的操作

信号(singal)和槽(Slot)是Qt中的核心机制,主要作用在于对象之间进行通讯。信号:当一个控件的状态发生变化时,向外界发出的信息。槽:一个执行操作的函数。所有继承自QWidge的控件都支持信号与槽的机制。

QObject的信号接收函数:

1.destroyed.connect()

该函数用于接收对象被释放的信号,槽就是当接收到信号后要执行的动作,动作可以写成方法传入。

obj = QObject()
def destroy_cao(obj): #这个就是槽
    print("对象被释放了!",obj)
obj.destroyed.connect(destroy_cao) #接收信号

Python qt5的多级菜单用什么控件_开发语言_02

2.objectNameChanged.connect()

该函数用于接收对象名称被修改的信号。

obj = QObject()
def obj_name(obj):
print("对象名称被修改了!",obj)
obj.objectNameChanged.connect(obj_name)
obj.setObjectName("CHANGE")

Python qt5的多级菜单用什么控件_开发语言_03

信号处理:

connect

连接信号与槽。

disconnect

断开信号与槽的连接。

blockSignals(bool)

临时阻断信号与槽的连接,True:阻断。

signalsBlocked()

返回信号与槽是否被阻断。

receivers("信号")

返回连接到信号的接收器数量

例子----当标题被修改在前面加“change-”:

window = Window()
window.setWindowTitle("窗口")

def win_change(title): #槽
 window.windowTitleChanged.disconnect() #断开标题信号与槽
 print("标题已被修改。", title)          #提示标题修改的内容
 window.setWindowTitle("Change-"+title) #设置标题加上“change-”
 window.windowTitleChanged.connect(win_change) 

window.windowTitleChanged.connect(win_change)#连接标题信号与槽
window.setWindowTitle("窗口1")
window.setWindowTitle("窗口2")

Python qt5的多级菜单用什么控件_python_04

Python qt5的多级菜单用什么控件_信号与槽_05


四、类型判断----过滤筛选控件

isWidgetType()

判断是否是控件类型。

isherits(父类)

判断一个对象是否继承(直接或间接)自某一父类

例子----将窗口内所有的QLable控件设置背景色为cyan

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def  __init__(self):
        super().__init__()
        self.setWindowTitle("Qobject的应用")
        self.resize(500, 300)
        self.ui()
    def ui(self):
        labeel1 = QLabel(self)
        labeel1.move(0,0)
        labeel1.setText("This is Label1")
        labeel2 = QLabel(self)
        labeel2.move(0, 50)
        labeel2.setText("This is Label2")

        btn = QPushButton(self)
        btn.move(0,100)
        btn.setText("Click!")
        for widget in self.children(): #获取窗口里的所以子类
            if widget.inherits("QLabel"): #筛选QLabel
                widget.setStyleSheet("background-color:cyan;") #设置背景色

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Python qt5的多级菜单用什么控件_开发语言_06


五、deleteLater对象删除

删除一个对象时,也会解除它与父类对象之间的关系。

deleteLater():该函数并没有将对象立即销毁,而是向主消息循环发送了一个event,等到下一次主消息循环收到这个event之后才会撤销对象,这样做的好处是可以在延迟删除的时间内完成一些操作,坏处是内存释放不及时。

看下面的代码:

obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj3.setParent(obj2)
obj2.setParent(obj1)
self.obj1 = obj1 #self是QWidget类
obj1.destroyed.connect(lambda : print("obj1被释放"))
obj2.destroyed.connect(lambda : print("obj2被释放"))
obj3.destroyed.connect(lambda : print("obj3被释放"))
obj2.deleteLater()
print(obj1.children())

运行结果:

Python qt5的多级菜单用什么控件_qt_07

可以看到程序先是输出了“obj2.deleteLater()”后面的print,在第二个消息循环才执行obj2.deleteLater()。


五、定时器

startTimer(ms,Qt.TimerType) -> timer_id

开启一个定时器。Qt.PreciseTimer:精准计时器-尽可能保持毫秒准度。Qt.CoarseTimer:粗定时器-5%的误差间隔。Qt.VeryCoarseTimer:很粗定时器-只能到秒级。

timer_id:定时器的ID

killTimer(timer_id)

根据定时器的ID,删除定时器。

timeEvent()

定时器的执行事件。

例子--实现倒计时

from PyQt5.Qt import *
import sys

#创建一个QLabel的子类MyQLabel
class MyQLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setText("10")        #标签初始内容
        self.move(100,100)        #设置标签位置
        self.setStyleSheet("font-size: 22px;")    #设置标签样式
        self.time_id = self.startTimer(1000)      #创建一个计时器
    # 重写timerEvent的方法
    def timerEvent(self, a0: 'Qt.PreciseTimer'):
        current_sec = int(self.text())
        current_sec -= 1
        self.setText(str(current_sec))
        if current_sec == 0:
            self.killTimer(self.time_id)
    #设置倒计时数
    def setSec(self,sec):
        self.setText(str(sec))

class Window(QWidget):
    def  __init__(self):
        super().__init__()
        self.setWindowTitle("Qobject的应用")
        self.resize(500, 300)
        self.ui()
    def ui(self):
        #设置标签
        label1 = MyQLabel(self)
        label1.setSec(10)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Python qt5的多级菜单用什么控件_python_08