在 PyQt5 中显示和隐藏多个窗口

Posted

技术标签:

【中文标题】在 PyQt5 中显示和隐藏多个窗口【英文标题】:Showing and hiding multiple windows in PyQt5 【发布时间】:2018-03-01 23:36:36 【问题描述】:

我正在开发一个带有 UI 的项目,并开始使用 PyQt5 来完成它。到目前为止,我观看了很多视频,阅读了一些教程并在项目上取得了进展。由于 PyQt 是 Python 的 C++ 的绑定,因此对于具有大量窗口的复杂 UI 的文档并不多。(或者我找不到它并且还查看了 PyQt5 的示例)。我的项目包含很多窗口。我正在尝试从用户那里获取一些参数,并且由于用户参数优化算法将起作用。所以项目包含这些窗口

    登录窗口(Qwidgets)第一视图 登录注册窗口(Qwidgets)如果用户没有帐户第二次查看 如果用户登录到系统 Tabwidget 将显示 4 个子选项卡视图,这些选项卡将从用户那里获取参数。在这个小部件中,已经有 2 个子选项卡具有用户可以选择的值,但也有一些按钮可以打开新的 Qwidget 类窗口,带有 OK 和 CANCEL 按钮。一个用于选择文件目录的选项卡,我在这里使用了 QfileDialog 类。最后一个选项卡从用户那里获取最后一个参数并打开用户在第三个选项卡中选择的文件。 在 Tab 视图之后,我打开了一个 Plotview,其中包含用户选择的文件,并在该窗口中用户通过绘制一些多边形来提供绘图参数。我在这里使用 Pyqtgraph 库 优化算法在不连接 Pyqt 的情况下也能正常工作

我在设计 UI 时主要使用 Qt Designer。但后来对其进行了更改,添加了一些方法来从用户那里获取参数并连接其他选项卡或其他窗口。

通过在类(窗口)中定义方法,我可以打开其他窗口,但不能隐藏或关闭已经打开的窗口。如果我尝试关闭它们,所有进程都会关闭,但我想关闭唯一的那个窗口。我在登录注册窗口中遇到了这个问题,弹出窗口用于从第一个和第二个 tabview 中的用户那里获取额外的参数。我的主要从登录窗口开始。之后在 Loginwindow 中,如果登录成功则进入 tabview 窗口。通过键入 mainwindow.hide() 并显示 tabview 窗口,我已经成功了。但在那之后,在所有弹出窗口中,我无法关闭从用户那里获取参数的弹出窗口。

由于代码太长,我就放在这里感兴趣的部分。

class LoginUp(object):

   def setupUi(self,LoginUp):
        self.Buton1.clicked.connect(self.signup)
        self.Buton2.clicked.connect(self.tabview)
   def signup(self):
        # here it shows but user cant close it by just clicking on OK button 
        # He must click on x button to close which I dont want.
        self.signupshow = QtWidgets.QWidget()                                  
        self.ui = LoginSignUp()
        self.ui.setupUi(self.signupshow)
        self.signupshow.show()

   def tabview(self):  # Here its works
        self.tabviewshow = QtWidgets.QWidget()
        self.ui_tabview = TabView()
        self.ui_tabview.setupUi(self.tabviewshow)
        MainWindow.close()
        self.tabviewshow.show()
class TabView(object):

    def setupUi(self,Form):
        self.button3.clicked.connect(self.addargument)

    def addargument(self):
        # same problem.. after that it popups window that user can give inputs but cant close the window AddArgument class 
        self.Add = QtWidgets.QWidget()
        self.addargumentshow = AddArgument()
        self.addargumentshow.setupUi(self.Add)
        self.addargumentshow.show()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QWidget()
    ui = LoginUp()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是使用另一个类作为您要显示的所有窗口的控制器。

在每个窗口中,当您想要切换窗口时,您将发送一个信号,由该控制器类决定在收到信号时如何处理信号并决定显示哪个窗口。您需要传递的任何参数都可以通过信号传递。

Here is a simplified complete working example。

【讨论】:

谢谢 MalloyDecroix 我已经在我的代码中实现了控制器类,它运行良好。

以上是关于在 PyQt5 中显示和隐藏多个窗口的主要内容,如果未能解决你的问题,请参考以下文章

PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

PyQt5控制 窗口和显示窗口

我的绘图未显示在我的 pyqt5.QtWidgets

PyQt5编程(17):窗口事件

PyQt5如何在一个窗口中显示不同的页面?

PyQT5 显示在窗口上花费的时间