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