赞
踩
这个是我们程序的框架,下面介绍的函数可以往函数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()设置的属性名称。 |
案例:创建多个用于信息提示的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_())
-
-

效果:
setParent(parent) | 设置父对象。 |
parent() | 获取父对象。 |
chidren() | 获取所有直接子对象。 |
findChild(参数1,参数2,参数3) | 获取一个指定名称或类型的子对象,参数1:类型QObject;参数2:通过setObjectName函数设置的名字;参数3:默认是递归查找,另一种是只查找直接子对象[Qt.FindDirectChildrenOnly] |
findChildren(参数1,参数2,参数3) | 获取多个指定名称或类型的子对象 |
信号(singal)和槽(Slot)是Qt中的核心机制,主要作用在于对象之间进行通讯。信号:当一个控件的状态发生变化时,向外界发出的信息。槽:一个执行操作的函数。所有继承自QWidge的控件都支持信号与槽的机制。
1.destroyed.connect(槽)
该函数用于接收对象被释放的信号,槽就是当接收到信号后要执行的动作,动作可以写成方法传入。
- obj = QObject()
- def destroy_cao(obj): #这个就是槽
- print("对象被释放了!",obj)
- obj.destroyed.connect(destroy_cao) #接收信号
2.objectNameChanged.connect(槽)
该函数用于接收对象名称被修改的信号。
- obj = QObject()
- def obj_name(obj):
- print("对象名称被修改了!",obj)
- obj.objectNameChanged.connect(obj_name)
- obj.setObjectName("CHANGE")
connect | 连接信号与槽。 |
disconnect | 断开信号与槽的连接。 |
blockSignals(bool) | 临时阻断信号与槽的连接,True:阻断。 |
signalsBlocked() | 返回信号与槽是否被阻断。 |
receivers("信号") | 返回连接到信号的接收器数量 |
- 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")
isWidgetType() | 判断是否是控件类型。 |
isherits(父类) | 判断一个对象是否继承(直接或间接)自某一父类 |
- 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_())

删除一个对象时,也会解除它与父类对象之间的关系。
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())
运行结果:
可以看到程序先是输出了“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_())

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。