Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以将QMainWindow添加到堆叠的小部件中吗_Python_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

Python 我可以将QMainWindow添加到堆叠的小部件中吗

Python 我可以将QMainWindow添加到堆叠的小部件中吗,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我试图通过使用堆叠的小部件在MainWindow和QDialog窗口之间切换。是否可以在堆叠小部件中添加AQmain窗口 class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(400, 300) self.centralwidget = QtW

我试图通过使用堆叠的小部件在MainWindow和QDialog窗口之间切换。是否可以在堆叠小部件中添加AQmain窗口

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(180, 110, 47, 13))
        self.label.setObjectName("label")
        self.nextButt = QtWidgets.QPushButton(self.centralwidget)
        self.nextButt.setGeometry(QtCore.QRect(10, 270, 75, 23))
        self.nextButt.setObjectName("nextButt")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Hi"))
        self.nextButt.setText(_translate("MainWindow", "Next"))


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.menuButt = QtWidgets.QPushButton(Dialog)
        self.menuButt.setGeometry(QtCore.QRect(20, 250, 75, 23))
        self.menuButt.setObjectName("menuButt")

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(200, 100, 47, 13))
        self.label.setObjectName("label")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.menuButt.setText(_translate("Dialog", "Menu"))
        self.label.setText(_translate("Dialog", "Bye"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    main_win = Ui_MainWindow()
    dialog = Ui_Dialog()
    stackedWidget = QStackedWidget()
    stackedWidget.addWidget(main_win)
    stackedWidget.addWidget(dialog)
    stackedWidget.show()
    sys.exit(app.exec_())
但我不断地出错

TypeError:addWidget(self,QWidget):参数1具有意外的类型“Ui\u MainWindow”

问题在于您试图添加所谓的表单类。这是一种标准的python
object
类型,它在PyQt上用作抽象对象“helper”,能够在现有的空QWidget子类上构建UI

QStackedWidget所期望的是一个QWidget子类(QMainWindow、QDialog等)。不幸的是,在创建QMainWindow实例时,您从未将其与
Ui\u MainWindow.setupUi()
函数一起使用,甚至没有创建QDialog实例

以下是您的代码的修订版本:

如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
mainWindow=QtWidgets.QMainWindow()
mainWindowUi=Ui_MainWindow()
mainWindowUi.setupUi(主窗口)
dialog=qtwidts.QDialog()
dialogUi=Ui\u Dialog()
dialogUi.setupUi(对话框)
stackedWidget=QtWidgets.QStackedWidget()
stackedWidget.addWidget(主窗口)
stackedWidget.addWidget(对话框)
mainWindowUi.nextButt.clicked.connect(
lambda:stackedWidget.setCurrentWidget(对话框))
dialogUi.menuButt.clicked.connect(
lambda:stackedWidget.setCurrentWidget(主窗口))
stackedWidget.show()
sys.exit(app.exec_())
一些考虑:

  • 请记住,
    pyuic
    生成的文件不应该被修改(也不应该试图模仿它们的行为);我可以假设你加入了他们的代码是为了简单,但是如果你没有加入,那么你实际上是在试图实现你的程序,你必须重新考虑它:pyuic生成的文件应该永远不会被修改(它们的代码不应该被添加到你的脚本中),因为它们应该总是作为导入使用;阅读更多关于
  • QMainWindow是一种非常特殊的QWidget子类,应该始终用作顶级窗口,而不是嵌入到另一个小部件中;如果您想添加子小部件,请使用标准的QWidget(“设计器启动对话框中的小部件”,通常称为“表单”)
  • 使用上面的代码,您可能会得到一个不可用的界面,因为除非调整顶层窗口的大小,否则两个子窗口小部件的内容将不可见;始终不鼓励使用固定的几何图形(位置和大小),因为这会导致无法访问或重叠的小部件,因此应始终优先使用