我试图通过在Qt设计器中升级来创建一个自定义小部件。问题是,Qt-Designer会自动将Ui_
添加到小部件名称前面。这会导致为主窗口生成的代码出错:
ImportError: cannot import name 'promotedWidget'
我可以通过在Qt设计器中重命名小部件(在Qt Designer中前置Ui_
)来修复此错误,同时升级。但是,我得到了一个错误:
我通过创建一个新的Python文件来避免这个错误,该文件仅环绕promotedWidget
:
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
在主.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_())
主_圭.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_())
在促销widget.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来定制小部件,但是我找不到符合我需要的答案。或者我只是还没想好这个过程。在
Qt Designer提供design类,不提供widget,我们有责任实现widget并使用设计,在您的情况下,解决方案很简单,创建
promotedWidget
类并通过setupUi()
函数实现设计,如下所示:促销widget.pyw:
相关问题 更多 >
编程相关推荐