python PyQt5對(duì)象類(lèi)型的判定及對(duì)象刪除操作詳細(xì)解讀

PyQt5類(lèi)型判定
主要是用來(lái)判定一個(gè)對(duì)象的類(lèi)型,或者說(shuō)是否繼承自某個(gè)類(lèi)
相關(guān)API和應(yīng)用場(chǎng)景如下
主要有兩個(gè)方法
- isWidgetType() 判斷某個(gè)對(duì)象是都控件類(lèi)型
- inherits() 一個(gè)對(duì)象是否繼承(直接或間接)自某個(gè)父類(lèi)
兩方法返回值均為T(mén)rue或False

類(lèi)型判斷演示
遍歷對(duì)象,判斷對(duì)象所屬類(lèi)型和父類(lèi)
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QObject的學(xué)習(xí)")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
self.QObject類(lèi)型判定()
def QObject類(lèi)型判定(self):
# *************API***************開(kāi)始
obj = QObject()
w = QWidget()
btn = QPushButton()
label = QLabel()
objs = [obj, w, btn, label]
for o in objs:
print("是否是QWidget的控件類(lèi)型",o.isWidgetType())
print("父類(lèi)是否是QWidget",o.inherits("QWidget"))
print("父類(lèi)是否是QPushButton",o.inherits("QPushButton"))
print("------------------------------------------")
# *************API***************結(jié)束
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())運(yùn)行??梢耘卸硞€(gè)對(duì)象所屬的類(lèi)型

PyQt5類(lèi)型判斷案例
根據(jù)所屬類(lèi)型, 設(shè)置指定的樣式
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QObject的學(xué)習(xí)")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
self.QObject類(lèi)型判定()
def QObject類(lèi)型判定(self):
# *************API***************開(kāi)始
# obj = QObject()
# w = QWidget()
# btn = QPushButton()
# label = QLabel()
#
# objs = [obj, w, btn, label]
# for o in objs:
# print("是否是QWidget的控件類(lèi)型",o.isWidgetType())
# print("父類(lèi)是否是QWidget",o.inherits("QWidget"))
# print("父類(lèi)是否是QPushButton",o.inherits("QPushButton"))
# print("------------------------------------------")
# *************API***************結(jié)束
# *************案例***************開(kāi)始
label1 = QLabel(self)
label1.setText("景天科技苑")
label1.move(100, 100)
label2 = QLabel(self)
label2.setText("科技不間斷")
label2.move(150, 150)
btn = QPushButton(self)
btn.setText("點(diǎn)我")
btn.move(200, 200)
#循環(huán)遍歷子對(duì)象
# for widget in self.findChildren(QLabel):
for widget in self.children():
# print(widget)
# if widget.isWidgetType():
#將子對(duì)象中為QLabel的對(duì)象設(shè)置背景樣式
if widget.inherits("QLabel"):
widget.setStyleSheet("background-color: cyan;")
# *************案例***************結(jié)束
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())運(yùn)行,QLabel顏色都發(fā)生了變化,btn的顏色不變,說(shuō)明選定了QLabel

PyQt5刪除對(duì)象
obj.deleteLater()
刪除一個(gè)對(duì)象時(shí), 也會(huì)解除它與父對(duì)象之間的關(guān)系。
deleteLater()并沒(méi)有將對(duì)象立即銷(xiāo)毀,而是向主消息循環(huán)發(fā)送了一個(gè)event,下一次主消息循環(huán)收到這個(gè)event之后才會(huì)銷(xiāo)毀對(duì)象。
這樣做的好處是可以在這些延遲刪除的時(shí)間內(nèi)完成一些操作,壞處就是內(nèi)存釋放會(huì)不及時(shí)。

刪除對(duì)象案例
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QObject的學(xué)習(xí)")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
self.QObject對(duì)象刪除()
def QObject對(duì)象刪除(self):
obj1 = QObject()
#為了防止局部變量運(yùn)行完方法就銷(xiāo)毀,將局部變量賦值給類(lèi)變量
self.obj1 = obj1
obj2 = QObject()
obj3 = QObject()
obj3.setParent(obj2)
obj2.setParent(obj1)
#創(chuàng)建信號(hào)與槽
obj1.destroyed.connect(lambda : print("obj1被釋放了"))
obj2.destroyed.connect(lambda : print("obj2被釋放了"))
obj3.destroyed.connect(lambda : print("obj3被釋放了"))
#刪除對(duì)象
# del obj2 #這樣并不能刪除
obj2.deleteLater()
print(obj1.children())
#obj2并沒(méi)有立馬被釋放
print("obj2",obj2)
#執(zhí)行了deleteLater后,向主消息循環(huán)發(fā)送了一個(gè)event,下一次主消息循環(huán)收到這個(gè)event之后才會(huì)銷(xiāo)毀對(duì)象,才會(huì)真正的去釋放相關(guān)的對(duì)象
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())運(yùn)行
可以看到obj2并沒(méi)有立馬被刪除,立馬打印obj1的子對(duì)象和obj2還是能打印出來(lái)的
過(guò)一段時(shí)間,obj2才被刪除

到此這篇關(guān)于python PyQt5對(duì)象類(lèi)型的判定,對(duì)象刪除操作詳細(xì)解讀的文章就介紹到這了,更多相關(guān)python PyQt5對(duì)象類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的畢業(yè)生信息管理系統(tǒng)的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的畢業(yè)生信息管理系統(tǒng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Tensorflow 利用tf.contrib.learn建立輸入函數(shù)的方法
這篇文章主要介紹了Tensorflow 利用tf.contrib.learn建立輸入函數(shù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
基于opencv實(shí)現(xiàn)簡(jiǎn)單畫(huà)板功能
這篇文章主要為大家詳細(xì)介紹了基于opencv實(shí)現(xiàn)簡(jiǎn)單畫(huà)板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Python全棧之文件函數(shù)和函數(shù)參數(shù)
這篇文章主要為大家介紹了Python的文件函數(shù)和函數(shù)參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12
python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能示例
這篇文章主要介紹了python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能,較為詳細(xì)的分析了fcntl模塊的具體功能并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)程序加鎖的操作技巧,需要的朋友可以參考下2017-06-06
Python機(jī)器學(xué)習(xí)之手寫(xiě)KNN算法預(yù)測(cè)城市空氣質(zhì)量
KNN(K-Nearest Neighbor)最鄰近分類(lèi)算法是數(shù)據(jù)挖掘分類(lèi)(classification)技術(shù)中常用算法之一,本文將介紹如何通過(guò)KNN算法實(shí)現(xiàn)城市空氣質(zhì)量的預(yù)測(cè),感興趣的同學(xué)可以了解一下2021-12-12
使用Python中的Playwright制作測(cè)試視頻的實(shí)現(xiàn)步驟
Playwright 是一種流行的用于測(cè)試 Web 應(yīng)用程序的自動(dòng)化工具,它提供了多種功能來(lái)使測(cè)試更加高效和可靠,這些功能之一是能夠捕獲測(cè)試運(yùn)行的視頻,在此博客中,田辛老師將探索如何使用 Python 中的 Playwright 制作測(cè)試視頻,感興趣的同學(xué)可以參考本文自己動(dòng)手嘗試2023-10-10
Python字符串格式化format()方法運(yùn)用實(shí)例
這篇文章主要給大家介紹了關(guān)于Python字符串格式化format()方法運(yùn)用實(shí)例的相關(guān)資料,字符串格式化是Python編程中十分常用的部分,它可以幫助我們將更具可讀性的數(shù)據(jù)輸出到控制臺(tái)或?qū)懭胛募?需要的朋友可以參考下2023-08-08

