我可以将 QMainWindow 添加到堆叠小部件吗
Can I add QMainWindow to a stacked widget
我正在尝试使用堆叠小部件在 MainWindow 和 QDialog Window 之间切换。是否可以在堆叠小部件中添加 aQMainWindow?
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): argument 1 has unexpected type 'Ui_MainWindow'
问题是您正在尝试添加所谓的 形式 class。这是一个标准的 python object
类型,它在 PyQt 上用作抽象对象“助手”,它能够在现有的空 QWidget subclass 上构建 UI .
QStackedWidget 期望的是 QWidget subclass(QMainWindow、QDialog 等)。不幸的是,当您创建 QMainWindow 实例时,您从未将它与 Ui_MainWindow.setupUi()
函数一起使用,您甚至没有创建 QDialog 实例。
这是您的代码的修订版:
如果__name__ == "__main__":
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
<b>主窗口=QtWidgets.QMainWindow()
mainWindowUi = Ui_MainWindow()
mainWindowUi.setupUi(主窗口)
对话框 = QtWidgets.QDialog()
dialogUi = Ui_Dialog()
dialogUi.setupUi(对话)</b>
stackedWidget = QtWidgets.QStackedWidget()
stackedWidget.addWidget(<b>主窗口</b>)
stackedWidget.addWidget(<b>对话框</b>)
mainWindowUi.nextButt.clicked.connect(
拉姆达:stackedWidget.setCurrentWidget(对话))
dialogUi.menuButt.clicked.connect(
拉姆达:stackedWidget.setCurrentWidget(主窗口))
stackedWidget.show()
sys.exit(app.exec_())
一些注意事项:
- 请记住,
pyuic
生成的文件 永远不会 被修改(您也不应尝试模仿它们的行为);我可以假设您为了简单起见已经加入了他们的代码,但如果您没有,而这实际上是您尝试实现程序的方式,您必须重新考虑它:pyuic 生成的文件应该 never被修改(它们的代码应该 不 添加到你的脚本中),因为它们应该始终用作导入;阅读更多关于 using Designer;
- QMainWindow 是一种非常特殊的 QWidget subclass,应始终用作 顶级 window,而不是嵌入到另一个小部件中;如果要添加子控件,请使用标准 QWidget(Designer 启动对话框中的“Widget”,通常称为“窗体”);
- 使用上面的代码,您可能会得到一个无法使用的界面,因为除非调整顶级 window 的大小,否则两个子小部件的内容将不可见;总是不鼓励使用固定的几何形状(位置和大小),因为它会导致无法访问或重叠的小部件,并且 layout managers 应该始终是首选;
我正在尝试使用堆叠小部件在 MainWindow 和 QDialog Window 之间切换。是否可以在堆叠小部件中添加 aQMainWindow?
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): argument 1 has unexpected type 'Ui_MainWindow'
问题是您正在尝试添加所谓的 形式 class。这是一个标准的 python object
类型,它在 PyQt 上用作抽象对象“助手”,它能够在现有的空 QWidget subclass 上构建 UI .
QStackedWidget 期望的是 QWidget subclass(QMainWindow、QDialog 等)。不幸的是,当您创建 QMainWindow 实例时,您从未将它与 Ui_MainWindow.setupUi()
函数一起使用,您甚至没有创建 QDialog 实例。
这是您的代码的修订版:
如果__name__ == "__main__":
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
<b>主窗口=QtWidgets.QMainWindow()
mainWindowUi = Ui_MainWindow()
mainWindowUi.setupUi(主窗口)
对话框 = QtWidgets.QDialog()
dialogUi = Ui_Dialog()
dialogUi.setupUi(对话)</b>
stackedWidget = QtWidgets.QStackedWidget()
stackedWidget.addWidget(<b>主窗口</b>)
stackedWidget.addWidget(<b>对话框</b>)
mainWindowUi.nextButt.clicked.connect(
拉姆达:stackedWidget.setCurrentWidget(对话))
dialogUi.menuButt.clicked.connect(
拉姆达:stackedWidget.setCurrentWidget(主窗口))
stackedWidget.show()
sys.exit(app.exec_())
一些注意事项:
- 请记住,
pyuic
生成的文件 永远不会 被修改(您也不应尝试模仿它们的行为);我可以假设您为了简单起见已经加入了他们的代码,但如果您没有,而这实际上是您尝试实现程序的方式,您必须重新考虑它:pyuic 生成的文件应该 never被修改(它们的代码应该 不 添加到你的脚本中),因为它们应该始终用作导入;阅读更多关于 using Designer; - QMainWindow 是一种非常特殊的 QWidget subclass,应始终用作 顶级 window,而不是嵌入到另一个小部件中;如果要添加子控件,请使用标准 QWidget(Designer 启动对话框中的“Widget”,通常称为“窗体”);
- 使用上面的代码,您可能会得到一个无法使用的界面,因为除非调整顶级 window 的大小,否则两个子小部件的内容将不可见;总是不鼓励使用固定的几何形状(位置和大小),因为它会导致无法访问或重叠的小部件,并且 layout managers 应该始终是首选;