1. 首页
  2. 家居生活
  3. 多窗口怎么设置(PyQt6创建多窗口方法)

多窗口怎么设置(PyQt6创建多窗口方法)

简介:关于多窗口怎么设置(PyQt6创建多窗口方法)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于家居生活技术大全及相关资讯,可以多多关注茶馆百科网。

在之前的教程中,我们介绍了如何打开对话框窗口。这些特殊的Windows(默认情况下)捕获用户的焦点并运行它们自己的事件循环,有效地阻止应用程序其余部分的执行。

但是,您经常希望在不破坏主窗口的情况下在应用程序中打开第二个窗口——,例如,显示一些长时间运行的进程的输出,或者显示图形或其他可视化效果。或者,您可能希望创建一个应用程序,允许您在各自的Windows中同时处理多个文档。

打开新窗口相对简单,但有几件事要记住,以确保它们正常工作。在本教程中,我们将逐步了解如何创建一个新窗口,以及如何根据需要显示和隐藏外部窗口。

在Qt中,任何没有父组件的小部件都是窗口。这意味着要显示一个新窗口,您只需要创建一个小部件的新实例。这可以是任何小部件类型(严格来说是QWidget的任何子类),如果您愿意,也可以是另一个QMainWindow。

QMainWindow实例的数量没有限制。如果您需要在第二个窗口上使用工具栏或菜单,则必须使用QMainWindow来执行此操作。然而,这可能会让用户感到困惑,所以要确保这是必要的。

与主窗口一样,创建一个窗口是不够的;您还必须显示它。

从PyQt6。QtWidgets导入QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidgetimport sysclass AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window') layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。button=QPushButton('Push for Window') self.button.clicked.connect(self.show_new_window) self. setcentralwidget (self.button) def show_new_window(self, checked): w=AnotherWindow() w.how ()app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()如果你运行这个程序,你会看到主窗口。单击按钮可能会显示第二个窗口,但如果您看到它,它只会在几分之一秒内可见。为什么呢?

def show_new_window(self, checked): w=AnotherWindow() w.how()在这个方法中,我们创建窗口(小部件)对象,将它存储在变量w中并显示它。然而,一旦我们离开这个方法,我们就不再有对w变量的引用(它是一个局部变量),所以它将被清除,——窗口将被销毁。为了解决这个问题,我们需要在某个地方保留对窗口的引用,比如在self对象上。

Def show_new_window(self, checked): self。w=AnotherWindow() self.w.how()现在,当您单击按钮显示新窗口时,它仍然存在。

但是如果你再次点击按钮会发生什么?窗口将被重新创建!这个新窗口将取代self中的旧窗口。自我。W变量,因为现在没有对它的引用-前一个窗口将被销毁。

如果您将窗口定义更改为每次创建标记时在标记中显示一个随机数,就可以看到这一点。

AnotherWindow(QWidget):“这个窗口是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('另一个窗口% d' % randint(0,100))布局。addwidget (self.label) self.setLayout(layout)__init__代码块仅在创建窗口时运行。如果继续单击该按钮,则数字将发生变化,并且正在重新创建显示窗口。

一种解决方案是在创建窗口之前检查窗口是否已经创建。下面的示例演示了这一点。

从PyQt6。QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidgetimport sysfrom random import randintclass AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。w=None #还没有外部窗口。自我。button=QPushButton('Push for Window') self.button.clicked.connect(self.show_new_window) self. setcentralwidget (self.button) def show_new_window(self, checked):如果self. new_window。w为None: self。w=AnotherWindow() self.w.show()app=QApplication(sys.argv)w=MainWindow()w.show()app.exec()使用该按钮,您可以弹出窗口,并使用窗口控件关闭它。如果再次单击该按钮,将重新显示相同的窗口。

此方法适用于临时创建的Windows ——,例如,如果您想弹出一个窗口来显示特定的图形或日志输出。然而,对于许多应用程序,您都有许多标准的Windows,您希望能够按需显示/隐藏它们。

在下一节中,我们将介绍如何使用这些类型的Windows。

字体

创建一个新窗口

通常,您需要使用工具栏或菜单上的操作来切换窗口的显示。正如我们前面看到的,如果没有保留对窗口的引用,它将被丢弃(并关闭)。我们可以使用这个行为来关闭一个窗口,用下面的代码替换前面示例中的show_new_window方法

Def show_new_window(self, checked): if self。w为None: self。w=AnotherWindow() self.w.show() else: self. show()w=None #丢弃引用,关闭窗口。通过设置self。w为None,则丢失对窗口的引用并关闭窗口。

如果我们将它设置为任何其他值None,窗口仍将关闭,但If self。w=None测试将不会在下次单击按钮时通过,因此我们将无法重新创建窗口。

这只在您没有在其他地方保留对窗口的引用时才有效。为了确保窗口无论如何都会关闭,您可能希望显式地对其调用.close()。完整示例如下所示。

从PyQt6。QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidgetimport sysfrom random import randintclass AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。w=None #还没有外部窗口。自我。button=QPushButton('Push for Window') self.button.clicked.connect(self.show_new_window) self. setcentralwidget (self.button) def show_new_window(self, checked):如果self. new_window。w为None: self。w=AnotherWindow() self.w.show() else: self.w.close() #关闭窗口。自我。w=None #丢弃引用。app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()

切换窗口

到目前为止,我们已经看到了如何按需创建一个新窗口。但是,有时您有许多标准应用程序Windows。在这种情况下,在启动时创建Windows,然后在需要时使用.show()显示它们,而不是在想要显示它们时创建它们,通常更有意义。

在下面的例子中,我们在主窗口的__init__块中创建了外部窗口,然后我们的show_new_window方法简单地调用self.w.how()来显示它。

从PyQt6。QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidgetimport sysfrom random import randintclass AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。w=AnotherWindow() self。button=QPushButton('Push for Window') self.button.clicked.connect(self.show_new_window) self. setcentralwidget (self.button) def show_new_window(self, checked): self.w.how ()app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()如果您运行此命令,单击按钮将显示与之前相同的窗口。但是请注意,该窗口只创建了一次,并且在已经可见的窗口上调用.show()没有任何效果。

一旦创建了持久窗口,就可以显示和隐藏它,而不必重新创建它。一旦隐藏,窗口仍然存在,但将不可见,并将接受鼠标/其他输入。但是,您可以继续调用窗口上的方法并更新其状态——,包括更改其外观。任何更改在重新显示后都是可见的。

现在让我们更新主窗口并创建toggle_window方法,使用。isvisible()检查当前窗口是否为visible。如果它不可见,则使用.show()显示它,如果它已经可见,则使用.hide()隐藏它。

class MainWindow(QMainWindow): def __init__(self): super().__init__() self。w=AnotherWindow() self。button=QPushButton('Push for Window') self.button.clicked.connect(self.toggle_window) self. setcentralwidget (self.button) def toggle_window(self .button): if self. w.t isvisible (): self. w.t hide() else: self. w.t show()一个完整的持久窗口和切换显示/隐藏状态的工作示例如下所示。

从PyQt6。QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidgetimport sysfrom random import randintclass AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为我们想要的自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。w=AnotherWindow() self。button=QPushButton('Push for Window') self.button.clicked.connect(self.toggle_window) self. setcentralwidget (self.button) def toggle_window(self, checked): if self. w.d isvisible (): self. w.t hide() else: self. w.t how ()app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()再次注意,窗口只创建一次——每次窗口重新显示时,窗口的__init__块不会重新运行(因此标签中的数字不会改变)。

您可以使用相同的原理创建多个Windows。只要您一直引用该窗口,事情就会按预期工作。最简单的方法是创建一个单独的方法来切换每个窗口的显示。

import sysfrom random import randintfrom PyQt6。QtWidgets导入(QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget,)类AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为一个自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。window1=AnotherWindow()自身。window2=AnotherWindow() l=QVBoxLayout() button1=QPushButton('Push for Window 1') button1.clicked.connect(self.toggle_window1) l. addwidget (button1) button2=QPushButton('Push for Window 2') button2.clicked.connect(self.toggle_window2) l. addwidget (button2) w=QWidget() w. setlayout (l) self. setcentralwidget (w) def toggle_window1(self . checked): if self.window1. isvisible (): self.window1.hide() else: self.window1.show() def toggle_window2(self . checked): if self.window2. isvisible (): if self.window2. isvisible ():self.window2.hide() else: self.window2.show()app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()然而,你也可以创建一个通用方法来处理所有Windows的切换。下面的示例演示如何使用lambda函数拦截来自每个按钮和通过适当窗口的信号。

import sysfrom random import randintfrom PyQt6。QtWidgets导入(QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget,)类AnotherWindow(QWidget): " '这个'窗口'是一个QWidget。如果它没有父窗口,它将显示为一个自由浮动窗口。“def __init__(自我):超级(). __init__()布局=QVBoxLayout()的自我。label=QLabel('Another Window % d' % randint(0,100)) layout. addwidget (self.label) self. setlayout (layout)类MainWindow(QMainWindow): def __init__(self): super().__init__() self。window1=AnotherWindow()自身。window2=AnotherWindow() l=QVBoxLayout() button1=QPushButton('Push for Window 1') button1.clicked。connect(lambda checked: self.toggle_window(self.window1)) l.addWidget(button1) button2=QPushButton('Push for Window 2')连接(lambda checked: self.toggle_window(self.window2)) l. addwidget (button2) w=QWidget() w. setlayout (l) self. setcentralwidget (w) def toggle_window(self, window): if window. isvisible (): window.hide() else: window.show()app=QApplication(sys.argv)w=MainWindow() w.how ()app.exec()只是为了避免你感到困惑,lambda有两种形式,像这样更简单

x=lambda a: a + 10print(x(5)),我相信你们中的许多人都能猜到而不理解,它作为表达式中的参数传递给a

语法规则:lambda参数:expression,它执行表达式并返回结果。目前还支持多个参数。这里没有例子。

另一种形式是:

def myfunc(n):返回lambda a: a * nmydoubler=myfunc(2)print(mydoubler(11))输出为11*2。

button1.clicked。connect(lambda checked: self.toggle_window(self.window1))def toggle_window(self, window): if window. isvisible (): window.hide() else: window.show()检查的代码参数没有使用

本文主要介绍了关于多窗口怎么设置(PyQt6创建多窗口方法)的相关养殖或种植技术,家居生活栏目还介绍了该行业生产经营方式及经营管理,关注家居生活发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解家居生活技术怎么管理的要点,是您家居生活致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1448175.html