PyQt5編程學習之控件基類QObject深入


一、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_())

 

 

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM