2017-09-18 59 views
1

我想通過在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中的自定義窗口小部件,但我找不到符合我的需要的答案。或者,我無法將我的頭圍繞過程。

回答

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) 
+0

感謝您的快速答覆!好的,所以我需要每個自定義小部件有3個文件。好吧.. –

相關問題