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

标签 python python-3.x pyqt5

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

  1. 登录窗口(Qwidgets){第一个 View }
  2. 登录注册窗口(Qwidgets){如果用户没有帐户第二次查看}
  3. 如果用户登录系统,Tabwidget 将显示 4 个子选项卡 View ,这些选项卡将从用户处获取参数。在此小部件中,已经有 2 个子选项卡已包含用户可以选择的值,而且还有一些按钮可通过“确定”和“取消”按钮打开新的 Qwidget 类窗口。用于选择文件目录的一个选项卡,我在这里使用了 QfileDialog 类。最后一个选项卡获取用户的最后一个参数并打开用户在第三个选项卡中选择的文件。
  4. 在选项卡 View 之后,我打开了一个 Plotview,其中包含用户选择的文件,并在该窗口中用户通过绘制一些多边形来在绘图上给出参数。{我在这里使用 Pyqtgraph 库}
  5. 优化算法将在不与 Pyqt 连接的情况下工作

我在设计 UI 时主要使用 Qt Designer。但后来更改了它,添加了一些方法来获取用户的参数以及连接其他选项卡或其他窗口。

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

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

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_())

最佳答案

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

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

Here is a simplified complete working example

关于python - 在 PyQt5 中显示和隐藏多个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060506/

相关文章:

python - 使用 Pandas 读取无分隔符的文件

python - 苹果 M1 : install psycopg2 package Symbol not found: _PQbackendPID

python - 试图找到类(class)内的号码

python-3.x - 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

python - 从 Redis 中的 channel 弹出消息

python - PyQt5 嵌入 3D 散点图

python - 如何访问 typing.Generic 的类型参数?

python - 如何简化通过索引搜索列表项的过程?

Python PyQt5 - 选择插入的光标文本?

python - 无法从 QTableWidget 中选择整行数据