本文主要介绍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多窗口)相关内容请关注本站点。