本文主要介紹pyqt5多窗口(python pyqt5多窗口),下面一起看看pyqt5多窗口(python pyqt5多窗口)相關(guān)資訊。
在上一個(gè)教程中,我們已經(jīng)介紹了如何打開對(duì)話窗口。這些特殊的窗口(默認(rèn)情況下)包含用戶 的焦點(diǎn)并運(yùn)行它們自己的事件循環(huán),有效地阻止了應(yīng)用程序的其余部分的執(zhí)行。
但是,您經(jīng)常希望在不中斷主窗口的情況下在應(yīng)用程序中打開第二個(gè)窗口,例如,顯示一些長(zhǎng)時(shí)間運(yùn)行的進(jìn)程的輸出,或者顯示圖形或其他可視化效果。或者,您可能希望創(chuàng)建一個(gè)允許您同時(shí)在不同的窗口中處理多個(gè)文檔的應(yīng)用程序。
打開新窗口相對(duì)簡(jiǎn)單,但是有一些事情要記住,以確保它們正常工作。在本教程中,我們將逐步學(xué)習(xí)如何創(chuàng)建一個(gè)新窗口,以及如何根據(jù)需要顯示和隱藏外部窗口。
在qt中創(chuàng)建新窗口,任何沒有父組件的widget都是一個(gè)窗口。這意味著要顯示一個(gè)新窗口,您只需要?jiǎng)?chuàng)建一個(gè)新的小部件實(shí)例。這可以是任何小部件類型(嚴(yán)格來說是qwidget的任何子類),如果愿意,還可以包含另一個(gè)qmainwindow。
qmainwindow實(shí)例的數(shù)量沒有限制。如果你需要一個(gè)工具欄或者菜單在第二個(gè)窗口上,你必須使用qmainwindow來實(shí)現(xiàn)。但是,這可能會(huì)讓用戶感到困惑,因此有必要確保這一點(diǎn)。
和主窗口一樣,創(chuàng)建一個(gè)窗口是不夠的,還必須顯示。
來自pyqt6。qtwidgets導(dǎo)入qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysclass anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d:()。_ _ init _ _()self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . show _ new _ window)self。setcentraliwidget (self。button) def show _ new _ window (self,check: w =另一個(gè)窗口()w . show()app = qa replication(sys . argv)w = main window()w . show()app . exec()如果運(yùn)行這個(gè)程序,就會(huì)看到主窗口。單擊該按鈕可能會(huì)顯示第二個(gè)窗口,但如果您看到它,它只會(huì)在幾分之一秒內(nèi)可見。這是為什么呢?
def show _ new _ window (self,check: w =另一個(gè)window () w.show()在這個(gè)方法中,我們創(chuàng)建一個(gè)window (widget)對(duì)象,存儲(chǔ)在變量w中并顯示出來。然而,一旦我們離開這個(gè)方法,我們就不再有對(duì)w變量(它是一個(gè)局部變量)的引用,所以它將被清除——并且窗口將被銷毀。為了解決這個(gè)問題,我們需要在某個(gè)地方保存一個(gè)對(duì)窗口的引用,比如在self對(duì)象上。
def show _ new _ window (self,check: self . w =另一個(gè)窗口()self.w.show()現(xiàn)在,當(dāng)你點(diǎn)擊按鈕顯示一個(gè)新窗口時(shí),它會(huì)持久化。
但是如果你再次點(diǎn)擊按鈕會(huì)發(fā)生什么呢?窗口將被重新創(chuàng)建!這個(gè)新窗口將取代自我中的舊窗口。self.w變量,因?yàn)楝F(xiàn)在沒有對(duì)它的引用——之前的窗口會(huì)被銷毀。
如果您將窗口定義更改為每次創(chuàng)建時(shí)在標(biāo)簽中顯示一個(gè)隨機(jī)數(shù),就可以看到這一點(diǎn)。
從隨機(jī)進(jìn)口randint class anoth: 這 窗與窗是一個(gè)qwidg:()。_ _ init _ _()layout = qvboxlayout()self . label = q label( 另一個(gè)窗口% d % randint (0,100))layout . add widget(self . label)self . set layout(layout)_ _ init _ _僅創(chuàng)建代碼塊。如果繼續(xù)單擊按鈕,數(shù)字將會(huì)改變,顯示窗口將被重新創(chuàng)建。
一種解決方案是在創(chuàng)建窗口之前簡(jiǎn)單地檢查它是否已經(jīng)被創(chuàng)建。下面的示例演示了這一點(diǎn)。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。__init__() self.w = none #還沒有外部窗口。self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . show _ new _ window)self . setcentralwidget(self . button)def show _ new _ window (self,check: if s: self . w =另一個(gè)窗口()self . w . show()app = qa application(sys . argv)w = main window()w . show()app . exec()用按鈕可以彈出窗口,用窗口控件關(guān)閉窗口。如果再次單擊該按鈕,將重新顯示同一窗口。
這種方法適合于臨時(shí)創(chuàng)建的窗口——例如,如果你想彈出一個(gè)窗口來顯示特定的圖形或日志輸出。然而,對(duì)于許多應(yīng)用程序,您有許多標(biāo)準(zhǔn)窗口,并且您希望能夠按需顯示/隱藏它們。
在下一節(jié)中,我們將看看如何使用這些類型的窗口。
切換窗口通常,你需要使用工具欄或菜單上的動(dòng)作來切換窗口的顯示。正如我們前面看到的,如果沒有保留對(duì)窗口的引用,它將被丟棄(并關(guān)閉)。我們可以使用此行為關(guān)閉一個(gè)窗口,并用下面的代碼替換前面示例中的show_new_window方法。
def show_new_window(self,check: if s: s: self . w = none # discard referenc測(cè)試將不會(huì)在我們下一次點(diǎn)擊按鈕時(shí)通過,因此我們將無法重新創(chuàng)建窗口。
這是唯一有效的,如果你不。;不要在其他地方保存對(duì)該窗口的引用。為了確保窗口無論如何都會(huì)關(guān)閉,您可能希望顯式調(diào)用。關(guān)閉它的()。下面顯示了一個(gè)完整的示例。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。__init__() self.w = none #還沒有外部窗口。self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . show _ new _ window)self . setcentralwidget(self . button)def show _ new _ window(self,check: if s: s: self . w . close()#關(guān)閉窗口。self . w = none # discard reference . app = qa application(sys . argv)w = main window()w . show()app . exec()連續(xù)窗口到目前為止,我們已經(jīng)學(xué)會(huì)了如何按需創(chuàng)建新窗口。然而,有時(shí)你有許多標(biāo)準(zhǔn)的應(yīng)用程序窗口。在這種情況下,與其在需要顯示窗口時(shí)創(chuàng)建窗口,不如在啟動(dòng)時(shí)創(chuàng)建窗口,然后用。需要時(shí)顯示()。
在下面的例子中,我們?cè)谥鞔翱诘腳_init__塊中創(chuàng)建一個(gè)外部窗口,然后我們的show_new_window方法簡(jiǎn)單地調(diào)用self。。w.show()來顯示它。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . w = another window()self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . show _ new _ window)self . setcentraliwidget(self . button)def show _ new _ window(self,check: self . w . show()app = qa replication(sys . argv)w = main window()w . show()app . exec()如果運(yùn)行此命令,單擊此按鈕將顯示與之前相同的窗口。但是,請(qǐng)注意,窗口只創(chuàng)建一次,調(diào)用。在已經(jīng)可見的窗口上顯示()沒有效果。
顯示和隱藏持久窗口一旦創(chuàng)建了持久窗口,無需重新創(chuàng)建就可以顯示和隱藏它。一旦隱藏,窗口仍然存在,但將不可見,并將接受鼠標(biāo)/其他輸入。但是,您可以繼續(xù)繼續(xù)調(diào)用窗口的方法并更新它的狀態(tài)——包括改變它的外觀。一旦重新顯示,任何更改都將可見。
讓 更新主窗口,創(chuàng)建一個(gè)toggl:級(jí)d:超級(jí)()。_ _ init _ _()self . w = another window()self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . toggle _ window)self . setcentralwidget(self . button)def toggle _ window(self,check: if s: s: self . w . show()這個(gè)持久窗口以及切換顯示/隱藏狀態(tài)的完整工作示例如下所示。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . w = another window()self . button = q push button( 推開窗戶 )self . button . clicked . connect(self . toggle _ window)self . setcentralwidget(self . button)def toggle _ window(self,check: if s: s: self . w . show()app = qa application(sys . argv)w = main window()w . show()app . exec()再次注意,窗口只創(chuàng)建一次——每次窗口重新顯示時(shí),窗口的__init__塊都不會(huì)再運(yùn)行(所以標(biāo)簽中的數(shù)字不會(huì)改變)。
多個(gè)窗口你可以用同樣的原則創(chuàng)建多個(gè)窗口——只要你保持對(duì)窗口的引用,事情就會(huì)像預(yù)期的那樣工作。最簡(jiǎn)單的方法是創(chuàng)建一個(gè)單獨(dú)的方法來切換每個(gè)窗口的顯示。
導(dǎo)入sysfrom隨機(jī)導(dǎo)入randintfrom pyqt6。類anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . window 1 = another window()self . window 2 = another window()l = qvboxlayout()button 1 = q push button( 推開一號(hào)窗)button 1 . clicked . connect(self . toggle _ window 1)l . add widget(button 1)button 2 = q push button( 推動(dòng)窗口2 )button 2 . clicked . connect(self . toggle _ window 2)l . add widget(button 2)w = q widget()w . set layout(l)self . setcentralwidget(w)def toggle _ window 1(self,check: if s: s: self . window 1 . show()def toggle _ window 2(self,check: if s: s: self . window 2 . show()app = qa replication(sys . argv)w = main window()w . show()app . exec()但是,也可以創(chuàng)建下面的例子演示了如何使用lambda函數(shù)截取來自每個(gè)按鈕的信號(hào),并將其傳遞到適當(dāng)?shù)拇翱凇?br>導(dǎo)入sysfrom隨機(jī)導(dǎo)入randintfrom pyqt6。qtwidgets導(dǎo)入(qa application類anoth: 這 窗與窗是一個(gè)qwidg:超級(jí)()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . window 1 = another window()self . window 2 = another window()l = qvboxlayout()button 1 = q push button( 推開一號(hào)窗)button 1 . clicked . connect(lambda check: self . toggle _ window(self . window 1))l . add widget(button 1)button 2 = q push button( 推動(dòng)窗口2 )button 2 . clicked . connect(lambda check: self . toggle _ window(self . window 2))l . add widget(button 2)w = q widget()w . set layout(l)self . setc: if window . is visibl: window . hid: window . show()app = qa application(sys . argv)w = main window()w . show()app . exec()另外解釋一下上面的lambda表達(dá)式,以免小伙伴看不懂。lambda有兩種形式,比如這個(gè)。
x =λa : a 10 print(x(5))我相信很多小伙伴不了解也能猜到這個(gè),a在表達(dá)式中作為參數(shù)傳入。
語法規(guī)則:lambda參數(shù):表達(dá)式,執(zhí)行表達(dá)式并返回結(jié)果。目前也支持多個(gè)參數(shù),這里不舉例。
另一種形式是:
def myfunc(n):返回lambda a : a * nmydoubler = my func(2)print(my doubler(11))輸出結(jié)果為11*2。
button 1 . clicked . connect(λcheck: s: if window.isvisibl: window。隱藏():窗口。show()不使用檢查的代碼參數(shù)。
了解更多pyqt5多窗口(python pyqt5多窗口)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。
驍龍?zhí)幚砥髋琶焯輬D,目前最好的手機(jī)處理器排名
筆記本電腦玩游戲看什么配置
edius怎么設(shè)置入點(diǎn)和出點(diǎn)(edius分割視頻快捷鍵)
汽車模擬器游戲大全中文版汽車(大型模擬汽車游戲電腦)
如何簡(jiǎn)單地判斷麥克風(fēng)的質(zhì)量好壞視頻(怎樣判斷麥克風(fēng)質(zhì)量)
pyqt5多窗口(python pyqt5 多窗口)
大麥票二維碼驗(yàn)不出來(大麥票務(wù)驗(yàn)證碼怎么查)
華為mate8怎么設(shè)置截屏,華為mate8截屏怎么操作
thinkpadt460p參數(shù)(thinkpadt460p支持nvme嗎)
電腦怎么切換mac系統(tǒng)(mac電腦如何換系統(tǒng))
win10linux雙系統(tǒng)啟動(dòng)(linux雙系統(tǒng)設(shè)置啟動(dòng)順序)
手提電腦黑屏了怎么恢復(fù)正常,手提電腦黑屏如何恢復(fù)
手機(jī)上照片怎么找到嗎,手機(jī)照片刪了可以恢復(fù)嗎
蘋果11手機(jī)觸屏卡(蘋果11屏幕卡住不動(dòng)怎么辦)
蘋果愛思助手一鍵刷機(jī)教程(iphone愛思助手刷機(jī)步驟)
哪一代主板開始支持M2,可以裝fx 8350的主板哪款支持m2固態(tài)
蘋果4s沒服務(wù)怎么辦,蘋果4s無服務(wù)怎么辦
聯(lián)通寬帶注銷光貓丟了(聯(lián)通光貓丟了可以買一個(gè)退回嗎)
怎么裝系統(tǒng)分區(qū)教程,電腦怎么裝系統(tǒng)和分區(qū)要說詳細(xì)
小米4和小米note哪個(gè)性能好(小米4與小米note)