在pyqt5中使用多个窗口

问题描述

我正在使用 PyQGIS 和 PyQt5 为 QGIS 构建插件。我想使用多个窗口。单击按钮后,应打开一个新窗口。理想情况下,它应该与窗口 1 重叠。在窗口 2 中编辑后,应返回到窗口 1。

我之前的代码是这样的:

class MainWindow(QDialog):
    def __init__(self):
        super(MainWindow,self).__init__()
        loadUi(r"test1.ui",self)
        self.button.clicked.connect(self.gotoScreen2)

    def gotoScreen2(self):
        screen2=Screen2()
        widget.addWidget(screen2)
        widget.setCurrentIndex(widget.currentIndex()+1)
        
class Screen2(QDialog):
    def __init__(self):
        super(Screen2,self).__init__()
        loadUi(r"test2.ui",self)
        self.pushButton.clicked.connect(self.gotoScreen1)
        
    def gotoScreen1(self):
        mainwindow = MainWindow()
        widget.addWidget(mainwindow)
        widget.setCurrentIndex(widget.currentIndex()+1)
        
#main
app = QApplication(sys.argv)
widget = QtWidgets.QStackedWidget() 
mainwindow = MainWindow()
widget.addWidget(mainwindow)
widget.show()

以此为基础,我希望插件窗口停靠在程序的右侧。我知道使用 QDockWidget 类和 addDockWidget (QtCore.Qt.RightDockWidgetArea,...) 是可能的。 但是如何将这些类内置到我的脚本中?

解决方法

这是我的解决方案(现在有三个 UI(窗口)可以直接相互通信。)它在 QGIS 中工作得非常好。

class MainWindow(QDialog):
    def __init__(self):
        super(MainWindow,self).__init__()
        self.gui = loadUi(r"test1.ui",self)
        self.button.clicked.connect(self.gotoScreen2)
        self.btn_adding.clicked.connect(self.adding)

    def gotoScreen2(self):
        screen2=Screen2()
        widget.setWidget(screen2)
        
class Screen2(QDialog):
    def __init__(self):
        super(Screen2,self).__init__()
        loadUi(r"test2.ui",self)
        self.pushButton.clicked.connect(self.gotoScreen1)
        self.pushButton_2.clicked.connect(self.gotoScreen3)
        
    def gotoScreen1(self):
        mainwindow = MainWindow()
        widget.setWidget(mainwindow)
        
    def gotoScreen3(self):
        screen3=Screen3()
        widget.setWidget(screen3)
        
class Screen3(QDialog):
    def __init__(self):
        super(Screen3,self).__init__()
        loadUi(r"test3.ui",self)
        self.pushButton.clicked.connect(self.gotoScreen2)
        
    def gotoScreen2(self):
        screen2=Screen2()
        widget.setWidget(screen2)


widget = QtWidgets.QDockWidget("test")
mainwindow = MainWindow()
widget.setWidget(mainwindow)
#dock on the right side of the screen
iface.addDockWidget(QtCore.Qt.RightDockWidgetArea,widget)
widget.show()