pyqt5多窗口(python pyqt5 多窗口)

發(fā)布時間:2024-03-18
本文主要介紹pyqt5多窗口(python pyqt5多窗口),下面一起看看pyqt5多窗口(python pyqt5多窗口)相關(guān)資訊。
在上一個教程中,我們已經(jīng)介紹了如何打開對話窗口。這些特殊的窗口(默認情況下)包含用戶 的焦點并運行它們自己的事件循環(huán),有效地阻止了應用程序的其余部分的執(zhí)行。
但是,您經(jīng)常希望在不中斷主窗口的情況下在應用程序中打開第二個窗口,例如,顯示一些長時間運行的進程的輸出,或者顯示圖形或其他可視化效果?;蛘?,您可能希望創(chuàng)建一個允許您同時在不同的窗口中處理多個文檔的應用程序。
打開新窗口相對簡單,但是有一些事情要記住,以確保它們正常工作。在本教程中,我們將逐步學習如何創(chuàng)建一個新窗口,以及如何根據(jù)需要顯示和隱藏外部窗口。
在qt中創(chuàng)建新窗口,任何沒有父組件的widget都是一個窗口。這意味著要顯示一個新窗口,您只需要創(chuàng)建一個新的小部件實例。這可以是任何小部件類型(嚴格來說是qwidget的任何子類),如果愿意,還可以包含另一個qmainwindow。
qmainwindow實例的數(shù)量沒有限制。如果你需要一個工具欄或者菜單在第二個窗口上,你必須使用qmainwindow來實現(xiàn)。但是,這可能會讓用戶感到困惑,因此有必要確保這一點。
和主窗口一樣,創(chuàng)建一個窗口是不夠的,還必須顯示。
來自pyqt6。qtwidgets導入qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysclass anoth: 這 窗與窗是一個qwidg:超級()。_ _ 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 =另一個窗口()w . show()app = qa replication(sys . argv)w = main window()w . show()app . exec()如果運行這個程序,就會看到主窗口。單擊該按鈕可能會顯示第二個窗口,但如果您看到它,它只會在幾分之一秒內(nèi)可見。這是為什么呢?
def show _ new _ window (self,check: w =另一個window () w.show()在這個方法中,我們創(chuàng)建一個window (widget)對象,存儲在變量w中并顯示出來。然而,一旦我們離開這個方法,我們就不再有對w變量(它是一個局部變量)的引用,所以它將被清除——并且窗口將被銷毀。為了解決這個問題,我們需要在某個地方保存一個對窗口的引用,比如在self對象上。
def show _ new _ window (self,check: self . w =另一個窗口()self.w.show()現(xiàn)在,當你點擊按鈕顯示一個新窗口時,它會持久化。
但是如果你再次點擊按鈕會發(fā)生什么呢?窗口將被重新創(chuàng)建!這個新窗口將取代自我中的舊窗口。self.w變量,因為現(xiàn)在沒有對它的引用——之前的窗口會被銷毀。
如果您將窗口定義更改為每次創(chuàng)建時在標簽中顯示一個隨機數(shù),就可以看到這一點。
從隨機進口randint class anoth: 這 窗與窗是一個qwidg:()。_ _ init _ _()layout = qvboxlayout()self . label = q label( 另一個窗口% d % randint (0,100))layout . add widget(self . label)self . set layout(layout)_ _ init _ _僅創(chuàng)建代碼塊。如果繼續(xù)單擊按鈕,數(shù)字將會改變,顯示窗口將被重新創(chuàng)建。
一種解決方案是在創(chuàng)建窗口之前簡單地檢查它是否已經(jīng)被創(chuàng)建。下面的示例演示了這一點。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個qwidg:超級()。_ _ 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 =另一個窗口()self . w . show()app = qa application(sys . argv)w = main window()w . show()app . exec()用按鈕可以彈出窗口,用窗口控件關(guān)閉窗口。如果再次單擊該按鈕,將重新顯示同一窗口。
這種方法適合于臨時創(chuàng)建的窗口——例如,如果你想彈出一個窗口來顯示特定的圖形或日志輸出。然而,對于許多應用程序,您有許多標準窗口,并且您希望能夠按需顯示/隱藏它們。
在下一節(jié)中,我們將看看如何使用這些類型的窗口。
切換窗口通常,你需要使用工具欄或菜單上的動作來切換窗口的顯示。正如我們前面看到的,如果沒有保留對窗口的引用,它將被丟棄(并關(guān)閉)。我們可以使用此行為關(guān)閉一個窗口,并用下面的代碼替換前面示例中的show_new_window方法。
def show_new_window(self,check: if s: s: self . w = none # discard referenc測試將不會在我們下一次點擊按鈕時通過,因此我們將無法重新創(chuàng)建窗口。
這是唯一有效的,如果你不。;不要在其他地方保存對該窗口的引用。為了確保窗口無論如何都會關(guān)閉,您可能希望顯式調(diào)用。關(guān)閉它的()。下面顯示了一個完整的示例。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個qwidg:超級()。_ _ 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)學會了如何按需創(chuàng)建新窗口。然而,有時你有許多標準的應用程序窗口。在這種情況下,與其在需要顯示窗口時創(chuàng)建窗口,不如在啟動時創(chuàng)建窗口,然后用。需要時顯示()。
在下面的例子中,我們在主窗口的__init__塊中創(chuàng)建一個外部窗口,然后我們的show_new_window方法簡單地調(diào)用self。。w.show()來顯示它。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個qwidg:超級()。_ _ 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()如果運行此命令,單擊此按鈕將顯示與之前相同的窗口。但是,請注意,窗口只創(chuàng)建一次,調(diào)用。在已經(jīng)可見的窗口上顯示()沒有效果。
顯示和隱藏持久窗口一旦創(chuàng)建了持久窗口,無需重新創(chuàng)建就可以顯示和隱藏它。一旦隱藏,窗口仍然存在,但將不可見,并將接受鼠標/其他輸入。但是,您可以繼續(xù)繼續(xù)調(diào)用窗口的方法并更新它的狀態(tài)——包括改變它的外觀。一旦重新顯示,任何更改都將可見。
讓 更新主窗口,創(chuàng)建一個toggl:級d:超級()。_ _ 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()這個持久窗口以及切換顯示/隱藏狀態(tài)的完整工作示例如下所示。
來自pyqt6。qapplication,qmainwindow,qpushbutton,qlabel,qvboxlayout,qwidgetimport sysfrom randintclass anoth: 這 窗與窗是一個qwidg:超級()。_ _ 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)建一次——每次窗口重新顯示時,窗口的__init__塊都不會再運行(所以標簽中的數(shù)字不會改變)。
多個窗口你可以用同樣的原則創(chuàng)建多個窗口——只要你保持對窗口的引用,事情就會像預期的那樣工作。最簡單的方法是創(chuàng)建一個單獨的方法來切換每個窗口的顯示。
導入sysfrom隨機導入randintfrom pyqt6。類anoth: 這 窗與窗是一個qwidg:超級()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . window 1 = another window()self . window 2 = another window()l = qvboxlayout()button 1 = q push button( 推開一號窗)button 1 . clicked . connect(self . toggle _ window 1)l . add widget(button 1)button 2 = q push button( 推動窗口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ù)截取來自每個按鈕的信號,并將其傳遞到適當?shù)拇翱凇?br>導入sysfrom隨機導入randintfrom pyqt6。qtwidgets導入(qa application類anoth: 這 窗與窗是一個qwidg:超級()。_ _ init _ _()layout = qvboxlayout()s: d: super()。_ _ init _ _()self . window 1 = another window()self . window 2 = another window()l = qvboxlayout()button 1 = q push button( 推開一號窗)button 1 . clicked . connect(lambda check: self . toggle _ window(self . window 1))l . add widget(button 1)button 2 = q push button( 推動窗口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表達式,以免小伙伴看不懂。lambda有兩種形式,比如這個。
x =λa : a 10 print(x(5))我相信很多小伙伴不了解也能猜到這個,a在表達式中作為參數(shù)傳入。
語法規(guī)則:lambda參數(shù):表達式,執(zhí)行表達式并返回結(jié)果。目前也支持多個參數(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)容請關(guān)注本站點。
上一個:紫點兜蘭的介紹
下一個:有哪些郵件群發(fā)軟件推薦

常見的電腦藍屏代碼及解決方法是什么(常見的電腦藍屏代碼及解決方法是)
天津婚紗攝影外景地
1206B202K500NT_202K 50V X7R 1206現(xiàn)貨購買,風華X7R 1206 2nF ±10% 50V
tuthill這個牌子如何,tuthill齒輪泵介紹
軟路由nas
承包和租賃的區(qū)別關(guān)鍵是什么
防水套管
怎么在系統(tǒng)中強制刪除運行中的文件記錄(怎么在系統(tǒng)中強制刪除運行中的文件)
老板強制加班能否進行拒絕
夏季怎樣管理盆花夏季管理技術(shù)
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos