我试图通过在Qt Designer中推广自定义小部件来创建它 . 问题是,Qt Designer会自动将 Ui_
添加到窗口小部件名称 . 这会导致为MainWindow生成的代码出错:
ImportError: cannot import name 'promotedWidget'
我可以通过在Qt Designer中重命名小部件(在 Ui_
之前)来修复此错误,同时进行推广 . 但是,我得到了这个错误:
TypeError: object() takes no parameters
我通过创建一个只包含 promotedWidget
的新Python文件来解决这个错误:
from PyQt5 import QtCore, QtGui, QtWidgets
from promotedwidget_raw import Ui_promotedWidget
class Ui_promotedWidget(Ui_promotedWidget, QtWidgets.QWidget):
def setupUi(self, promotedWidget):
super().setupUi(promotedWidget)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
promotedWidget = QtWidgets.QWidget()
ui = Ui_promotedWidget()
ui.setupUi(promotedWidget)
promotedWidget.show()
sys.exit(app.exec_())
这解决了这个问题,但我不喜欢创建包装器的想法只是为了让自定义小部件工作 . (而且我很确定我做错了)
这是我的(示例)项目文件:
main.py
main_gui.pyw # Generated from ui
main_gui.ui
promotedwidget.pyw # Generated from ui
promotedwidget.ui
main.py:
import sys
from PyQt5 import QtWidgets
from main_gui import Ui_MainWindow as MainWindow
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
main_gui.pyw:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'main_gui.ui'
#
# Created by: PyQt5 UI code generator 5.8.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.widget = promotedWidget(self.centralwidget)
self.widget.setObjectName("widget")
self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
from promotedwidget import promotedWidget
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
promotedwidget.pyw:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'promotedwidget.ui'
#
# Created by: PyQt5 UI code generator 5.8.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_promotedWidget(object):
def setupUi(self, promotedWidget):
promotedWidget.setObjectName("promotedWidget")
promotedWidget.resize(400, 300)
self.gridLayout = QtWidgets.QGridLayout(promotedWidget)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(promotedWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.retranslateUi(promotedWidget)
QtCore.QMetaObject.connectSlotsByName(promotedWidget)
def retranslateUi(self, promotedWidget):
_translate = QtCore.QCoreApplication.translate
promotedWidget.setWindowTitle(_translate("promotedWidget", "Form"))
self.label.setText(_translate("promotedWidget", "Test"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
promotedWidget = QtWidgets.QWidget()
ui = Ui_promotedWidget()
ui.setupUi(promotedWidget)
promotedWidget.show()
sys.exit(app.exec_())
我已经搜索了如何使用PyQt和Qt Designer制作自定义小部件,但我找不到符合我需求的答案 . 或者我还是无法绕过这个过程 .
1 回答
Qt Designer提供设计类,不提供小部件,我们有责任实现小部件并使用设计,在您的情况下解决方案很简单,创建
promotedWidget
类并通过setupUi()
函数实现设计,如下所示:promotedwidget.pyw: