我想通過在Qt設計器中提升它來創建自定義窗口小部件。問題是,Qt Designer會自動將Ui_
預置爲小部件名稱。這導致錯誤在主窗口生成代碼:提升窗口小部件並使用它們從生成的用戶界面
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中的自定義窗口小部件,但我找不到符合我的需要的答案。或者,我無法將我的頭圍繞過程。
感謝您的快速答覆!好的,所以我需要每個自定義小部件有3個文件。好吧.. –