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

2024-10-04 11:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过在Qt设计器中升级来创建一个自定义小部件。问题是,Qt-Designer会自动将Ui_添加到小部件名称前面。这会导致为主窗口生成的代码出错:

ImportError: cannot import name 'promotedWidget'

我可以通过在Qt设计器中重命名小部件(在Qt Designer中前置Ui_)来修复此错误,同时升级。但是,我得到了一个错误:

^{pr2}$

我通过创建一个新的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来定制小部件,但是我找不到符合我需要的答案。或者我只是还没想好这个过程。在


Tags: fromimportselfappuimainsysqtcore
1条回答
网友
1楼 · 发布于 2024-10-04 11:27:23

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

促销widget.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)

相关问题 更多 >