一、QObject描述:
PyQt幾乎所有的類都是從QObject直接或間接繼承的,QObject是所有PyQt類的基類,是PyQt對象模型的核心。
二、基類QObject的功能:
(一)操作對象名稱、屬性:
1、API介紹:
(1)setObjectName("唯一名稱"):給一個Qt對象設置一個名稱,一般這個名稱是唯一的,當做對象的ID來使用;
(2)objectName():獲取一個Qt對象的名稱;
(3)setProperty("屬性名稱",值):給一個Qt對象動態的添加一個屬性與值;
(4)property("屬性名稱"):獲取一個對象的屬性值;
(5)dynamicPropertyNames():獲取一個對象中所有通過setProperty()設置的屬性名稱;
2、應用實例:
用於QSS的ID選擇器,屬性選擇器:
(1)QSS樣式文件代碼(文件名:QObject.qss):
#ID選擇器:#notice,匹配所有的ID為#notice的QLabel控件,這里的ID實際上就是objectName指定的值; QLabel#notice { font-size: 20px; color: gray; border: 1px solid gray; border-radius: 8px; } #屬性選擇器:匹配所有的notice_level屬性是normal的且ID為notice的QLabel控件; QLabel#notice[notice_level="normal"] { color: green; border-color: green; } #屬性選擇器:匹配所有的notice_level屬性是warning的且ID為notice的QLabel控件; QLabel#notice[notice_level="warning"] { color: yellow; border-color: yellow; } #屬性選擇器:匹配所有的notice_level屬性是error的且ID為notice的QLabel控件; QLabel#notice[notice_level="error"] { color: red; border-color: red; }
(2)窗口界面創建代碼:
from PyQt5.Qt import * class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QObject的對象名稱,屬性") self.resize(500, 500) self.setup_ui() def setup_ui(self): self.QObjectOperate() def QObjectOperate(self): # *************案例演示***************開始 with open("QObject.qss", "r") as f: qApp.setStyleSheet(f.read()) #實例化一個QLabel對象label; label = QLabel(self) #設置對象label對象名為"notice" label.setObjectName("notice") #設置對象label的"notice_level"屬性值為"warning"; label.setProperty("notice_level", "warning") label.setText("屬性為warning的Qlabel") label2 = QLabel(self) label2.move(100, 100) label2.setObjectName("notice") label2.setProperty("notice_level", "error") label2.setText("屬性為error的Qlabel") label3 = QLabel(self) label3.setText("原始格式") label3.move(150, 150) btn = QPushButton(self) btn.setObjectName("notice") btn.setText("ID為notice的Qlabel") btn.move(50, 50) # *************案例演示***************結束 if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
(3)實例代碼運行結果:
(二)父子對象的操作:
1、API介紹:
(1)setParent(parent):用於設置父對象 (父對象只能設置一個);
(2)parent():獲取父對象;
(3)children():獲取所有直接子對象;
(4)findChild(參數1, 參數2, 參數3): 獲取某一個指定名稱和類型的子對象,參數1(類型:QObject,類型元組:(QPushButton, QLabel),參數2(名稱),參數3(查找選項:Qt.FindChildrenRecursively為遞歸查找,Qt.FindDirectChildrenOnly為只查找直接子對象);
(5)findChildren(參數1, 參數2, 參數3):獲取某多個指定名稱和類型的子對象;
2、應用實例:
涉及到Qt對象內存管理機制:當使用另一個QObject作為父對象創建QObject時,將自動添加到父對象的children()列表中,父對象會在被刪除時自動刪除子項;
(1)父子對象操作實例代碼:
from PyQt5.Qt import * class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QObject的對象名稱,屬性") self.resize(500, 500) self.setup_ui() def setup_ui(self): self.QObject對象的父子關系操作() def QObject對象的父子關系操作(self): # *************內存管理機制***************開始 obj1 = QObject() self.obj1 = obj1 obj2 = QObject() # 設置obj1為obj2的父對象; obj2.setParent(obj1) # 監聽obj2對象被釋放 obj2.destroyed.connect(lambda: print("obj2對象被釋放了")) # 父對象會在被刪除時自動刪除子項obj2; del self.obj1 # *************內存管理機制***************結束 if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
(2)實例代碼運行輸出結果:
"C:\Program Files\Python35\pythonw.exe" C:/Users/L/PycharmProjects/untitled3/Qobject2.py obj2對象被釋放了 Process finished with exit code 0
(三)信號處理:
1、API介紹:
(1)widget.信號.connect(槽):連接信號與槽;
(2)obj.disconnect():取消連接信號與槽;
(3)widget.blockSignals(bool):臨時(取消)阻止指定控件所有的信號與槽的連接;
(4)widget.signalsBlocked():信號是否被阻止;
(5)widget.receivers(信號):返回連接到信號的接收器數量;
2、應用實例:
(1)實例代碼:
from PyQt5.Qt import * class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QObject的對象名稱,屬性") self.resize(500, 500) self.setup_ui() def setup_ui(self): self.QObject信號的操作() def QObject信號的操作(self): self.obj = QObject() #定義槽 def obj_name_cao(name): print("對象名稱發生了改變", name) #連接信號與槽 self.obj.objectNameChanged.connect(obj_name_cao) #改變對象名稱,發送信號 self.obj.setObjectName("xxx") #取消連接信號與槽 self.obj.disconnect() ##改變對象名稱,發送信號,但信號與槽已斷開,所以不調用obj_name_cao函數; self.obj.setObjectName("xxTT") #返回信號是否被阻止 print(self.obj.signalsBlocked()) if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
(2)代碼輸出結果:
"C:\Program Files\Python35\pythonw.exe" C:/Users/L/PycharmProjects/untitled3/Qobject2.py 對象名稱發生了改變 xxx False
(四)類型判定:
1、API介紹:
(1)obj.inherits(父類) :返回對象是否屬於父類
(2) obj.isWidgetType() :返回對象是否屬於QWidget;
2、實例:
#案例——判定控件是否為標簽,將所有標簽背景色設為red from PyQt5.Qt import * import sys app=QApplication(sys.argv) window = QWidget() a = QLabel(window) a.move(100,200) b = QPushButton(window) b.move(300,200) c = QLabel(window) c.move(200,200) for widget in window.children(): if widget.inherits("QLabel"): widget.setStyleSheet('background-color:red') window.show() sys.exit(app.exec_())
(五)對象刪除:
1、API介紹:
obj.deleteLater():刪除一個對象時, 也會解除它與父對象之間的關系,deleteLater()並沒有將對象立即銷毀,而是向主消息循環發送了一個event,下一次主消息循環收到這個event之后才會銷毀對象,這樣做的好處是可以在這些延遲刪除的時間內完成一些操作,壞處就是內存釋放會不及時。
(六)定時器:
1、API介紹:
(1)startTimer(ms, Qt.TimerType) -> timer_id:開啟一個定時器;Qt.TimerType:1、Qt.PreciseTimer(精確定時器:盡可能保持毫秒准確);2、Qt.CoarseTimer(粗定時器:5%的誤差間隔);3、 Qt.VeryCoarseTimer(很粗的定時器:只能到秒級);
(2)killTimer(timer_id):根據定時器ID,殺死定時器;
(3)timerEvent():定時器執行事件
2、應用實例:
代碼功能:完成10~0的倒計時,最后輸出“stop!"
from PyQt5.Qt import * import sys class MyLabel(QLabel): def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) #重新對控件進行封裝 self.setText('10') self.setStyleSheet('font-size:22px;') self.resize(300,200) self.timer_id = self.startTimer(1000) #在這里生成timer_id def timerEvent(self, a0: 'QTimerEvent'): current_sec = int(self.text()) current_sec -= 1 self.setText(str(current_sec)) if current_sec == 0: self.setText("stop!") self.killTimer(self.timer_id) app=QApplication(sys.argv) window = QWidget() window.resize(500,500) label = MyLabel(window) #這里實例化的重構后的QObject label.move(200,200) window.show() sys.exit(app.exec_())