首页 文章

提升小部件并从生成的ui中使用它们

提问于
浏览
1

我试图通过在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 回答

  • 1

    Qt Designer提供设计类,不提供小部件,我们有责任实现小部件并使用设计,在您的情况下解决方案很简单,创建 promotedWidget 类并通过 setupUi() 函数实现设计,如下所示:

    promotedwidget.pyw:

    class Ui_promotedWidget(object):
        def setupUi(self, promotedWidget):
            [...]
        def retranslateUi(self, promotedWidget):
            [...]
    
    class promotedWidget(QtWidgets.QWidget, Ui_promotedWidget):
        def __init__(self, parent=None):
            QtWidgets.QWidget.__init__(self, parent)
            self.setupUi(self)
    

相关问题