【问题标题】:How to efficiently import user created Widget in MainWindow in PyQt5?如何在 PyQt5 的 MainWindow 中有效地导入用户创建的 Widget?
【发布时间】:2018-05-11 08:22:24
【问题描述】:

情况

我使用 Qt Designer 使用以下选项创建了自己的小部件(它是一个包含许多其他小部件的组框)MyWidget

Qt Designer Option Chosen

创建小部件后,我使用包含在文件 Hello.py 中的 Python 为其添加了更多功能。

在我的主代码(即mainwindow)中,我有一个组合框和两个标签。

我的问题

现在我想在主代码(Main.py)中导入MyWidget(在Hello.py中),这样MyWidget就出现在mainwindow中的combobox下方。我怎样才能有效地做到这一点?

你好.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MyWidget(object):
    def setupUi(self, MyWidget):
        MyWidget.setObjectName("MyWidget")
        MyWidget.resize(690, 327)
        self.gridLayout = QtWidgets.QGridLayout(MyWidget)
        self.gridLayout.setObjectName("gridLayout")
        self.VP_gridLayout_DefProp = QtWidgets.QGridLayout()
        self.VP_gridLayout_DefProp.setObjectName("VP_gridLayout_DefProp")
        self.VP_CB_Modulus = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_Modulus.setObjectName("VP_CB_Modulus")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_Modulus, 2, 3, 1, 1)
        self.VP_CB_DT = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_DT.setObjectName("VP_CB_DT")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_DT, 2, 1, 1, 2)
        self.VP_CB_FHC = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_FHC.setObjectName("VP_CB_FHC")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_FHC, 2, 5, 1, 1)
        self.VP_label_Criteria = QtWidgets.QLabel(MyWidget)
        self.VP_label_Criteria.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.VP_label_Criteria.setObjectName("VP_label_Criteria")
        self.VP_gridLayout_DefProp.addWidget(self.VP_label_Criteria, 2, 0, 1, 1)
        self.VP_line_Attenuation = QtWidgets.QLineEdit(MyWidget)
        self.VP_line_Attenuation.setObjectName("VP_line_Attenuation")
        self.VP_gridLayout_DefProp.addWidget(self.VP_line_Attenuation, 1, 1, 1, 3)
        self.VP_CB_PT = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_PT.setObjectName("VP_CB_PT")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_PT, 2, 4, 1, 1)
        self.VP_CB_PC = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_PC.setObjectName("VP_CB_PC")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_PC, 2, 6, 1, 1)
        self.VP_CB_OHT = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_OHT.setObjectName("VP_CB_OHT")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_OHT, 2, 7, 1, 1)
        self.VP_CB_FHT = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_FHT.setObjectName("VP_CB_FHT")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_FHT, 2, 8, 1, 1)
        self.VP_CB_Bearing = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_Bearing.setObjectName("VP_CB_Bearing")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_Bearing, 2, 9, 1, 1)
        self.VP_CB_Pull = QtWidgets.QCheckBox(MyWidget)
        self.VP_CB_Pull.setObjectName("VP_CB_Pull")
        self.VP_gridLayout_DefProp.addWidget(self.VP_CB_Pull, 2, 10, 1, 1)
        self.VP_push_clear = QtWidgets.QPushButton(MyWidget)
        self.VP_push_clear.setObjectName("VP_push_clear")
        self.VP_gridLayout_DefProp.addWidget(self.VP_push_clear, 3, 5, 1, 2)
        self.VP_label_Attenuation = QtWidgets.QLabel(MyWidget)
        self.VP_label_Attenuation.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.VP_label_Attenuation.setObjectName("VP_label_Attenuation")
        self.VP_gridLayout_DefProp.addWidget(self.VP_label_Attenuation, 1, 0, 1, 1)
        self.VP_label_Thickness = QtWidgets.QLabel(MyWidget)
        self.VP_label_Thickness.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.VP_label_Thickness.setObjectName("VP_label_Thickness")
        self.VP_gridLayout_DefProp.addWidget(self.VP_label_Thickness, 0, 0, 1, 1)
        self.VP_radio_grt5 = QtWidgets.QRadioButton(MyWidget)
        self.VP_radio_grt5.setObjectName("VP_radio_grt5")
        self.VP_gridLayout_DefProp.addWidget(self.VP_radio_grt5, 0, 1, 1, 1)
        self.VP_radio_less5 = QtWidgets.QRadioButton(MyWidget)
        self.VP_radio_less5.setObjectName("VP_radio_less5")
        self.VP_gridLayout_DefProp.addWidget(self.VP_radio_less5, 0, 2, 1, 1)
        self.gridLayout.addLayout(self.VP_gridLayout_DefProp, 0, 0, 1, 1)
        self.VP_table_Display = QtWidgets.QTableWidget(MyWidget)
        self.VP_table_Display.setObjectName("VP_table_Display")
        self.VP_table_Display.setColumnCount(4)
        self.VP_table_Display.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        item.setFont(font)
        self.VP_table_Display.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        item.setFont(font)
        self.VP_table_Display.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        item.setFont(font)
        self.VP_table_Display.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        item.setFont(font)
        self.VP_table_Display.setHorizontalHeaderItem(3, item)
        self.gridLayout.addWidget(self.VP_table_Display, 1, 0, 1, 1)

        self.VP_label_Attenuation.setBuddy(self.VP_line_Attenuation)

        self.retranslateUi(MyWidget)
        QtCore.QMetaObject.connectSlotsByName(MyWidget)

        #######################################################   
        #Clear Button         
        self.VP_push_clear.clicked.connect(lambda:self.clear_table(self.VP_push_clear))

      #######################################################
    def retranslateUi(self, MyWidget):
        _translate = QtCore.QCoreApplication.translate
        MyWidget.setWindowTitle(_translate("MyWidget", "VP"))
        self.VP_CB_Modulus.setText(_translate("MyWidget", "Modulus"))
        self.VP_CB_DT.setText(_translate("MyWidget", "DT:(CAI/CAIE)"))
        self.VP_CB_FHC.setText(_translate("MyWidget", "FHC"))
        self.VP_label_Criteria.setText(_translate("MyWidget", "Criteria"))
        self.VP_CB_PT.setText(_translate("MyWidget", "PT"))
        self.VP_CB_PC.setText(_translate("MyWidget", "PC"))
        self.VP_CB_OHT.setText(_translate("MyWidget", "OHT"))
        self.VP_CB_FHT.setText(_translate("MyWidget", "FHT"))
        self.VP_CB_Bearing.setText(_translate("MyWidget", "Bearing"))
        self.VP_CB_Pull.setText(_translate("MyWidget", "Pull Through"))
        self.VP_push_clear.setText(_translate("MyWidget", "Clear"))
        self.VP_label_Attenuation.setText(_translate("MyWidget", "Attenuation (in dB)"))
        self.VP_label_Thickness.setText(_translate("MyWidget", "Thickness"))
        self.VP_radio_grt5.setText(_translate("MyWidget", ">5mm"))
        self.VP_radio_less5.setText(_translate("MyWidget", "<=5mm"))
        item = self.VP_table_Display.horizontalHeaderItem(0)
        item.setText(_translate("MyWidget", "Thickness"))
        item = self.VP_table_Display.horizontalHeaderItem(1)
        item.setText(_translate("MyWidget", "Attenuation"))
        item = self.VP_table_Display.horizontalHeaderItem(2)
        item.setText(_translate("MyWidget", "Criteria"))
        item = self.VP_table_Display.horizontalHeaderItem(3)
        item.setText(_translate("MyWidget", "KDF"))
        ####################################################### 
    def clear_table(self,button):
        self.VP_table_Display.setRowCount(0)

        Chkbox = [self.VP_CB_Modulus,self.VP_CB_PC,self.VP_CB_FHC,self.VP_CB_DT,self.VP_CB_PT,self.VP_CB_OHT,self.VP_CB_FHT,self.VP_CB_Bearing,self.VP_CB_Pull]   

        for name in Chkbox:
            name.setChecked(False)                        
        #######################################################
if __name__ == "__main__":
    import sys
        #######################################################    
    app = QtCore.QCoreApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)

    MyWidget = QtWidgets.QGroupBox()
    ui = Ui_MyWidget()
    ui.setupUi(MyWidget)
    MyWidget.show()
    app.exec_()
        #######################################################

main.py

from PyQt5 import QtCore, QtGui, QtWidgets
        #######################################################
import hello.py
        #######################################################

class Ui_MainWindow(object):
        #######################################################
    def MyWid_groupBox(self):
        self.window = QtWidgets.QGroupBox()
        self.ui     = hello.Ui_MyWidget()
        self.window.show
        #######################################################
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(708, 462)
        MainWindow.setFocusPolicy(QtCore.Qt.WheelFocus)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)

        self.gridLayout_2.setObjectName("gridLayout_2")

        self.VP_push_close = QtWidgets.QPushButton(self.centralwidget)
        self.VP_push_close.setObjectName("VP_push_close")
        self.gridLayout_2.addWidget(self.VP_push_close, 3, 1, 1, 1)

        self.line_separate = QtWidgets.QFrame(self.centralwidget)
        self.line_separate.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_separate.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_separate.setObjectName("line_separate")
        self.gridLayout_2.addWidget(self.line_separate, 1, 0, 1, 2)

        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")

        self.label_DefType = QtWidgets.QLabel(self.centralwidget)
        self.label_DefType.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.label_DefType.setObjectName("label_DefType")
        self.gridLayout.addWidget(self.label_DefType, 0, 0, 1, 1)

        self.combo_Deftype = QtWidgets.QComboBox(self.centralwidget)
        self.combo_Deftype.setObjectName("combo_Deftype")
        self.combo_Deftype.addItem("")
        self.combo_Deftype.addItem("")
        self.combo_Deftype.addItem("")
        self.gridLayout.addWidget(self.combo_Deftype, 0, 1, 1, 1)

        spacerItem = QtWidgets.QSpacerItem(148, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)

        self.gridLayout.addItem(spacerItem, 0, 2, 1, 1)

        self.label_MDOCLink = QtWidgets.QLabel(self.centralwidget)
        self.label_MDOCLink.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.label_MDOCLink.setObjectName("label_MDOCLink")
        self.gridLayout.addWidget(self.label_MDOCLink, 0, 3, 1, 1)

        self.gridLayout_2.addWidget(self.VolPorosity_groupBox, 2, 0, 1, 2)

        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)
        self.label_DefType.setBuddy(self.combo_Deftype)

        self.retranslateUi(MainWindow)
        self.VP_push_close.clicked.connect(MainWindow.close)                              #Close Button
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

        self.VP_push_close.setText(_translate("MainWindow", "Close"))
        self.label_DefType.setText(_translate("MainWindow", "Choose the Type"))
        self.combo_Deftype.setItemText(0, _translate("MainWindow", "-"))
        self.combo_Deftype.setItemText(1, _translate("MainWindow", "X"))


if __name__ == "__main__":
    import sys

        #######################################################    
    app = QtCore.QCoreApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)

#    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    app.exec_()
        #######################################################

PS:长哈希线之间的任何内容都是我添加到使用 Qt 设计器生成的代码中的代码。

【问题讨论】:

  • @eyllanesc 你知道吗?

标签: python python-3.x pyqt5 qt-designer


【解决方案1】:

这个问题的答案可以在以下视频中找到:PyQt : Open Other Window When Button Clicked。这对于理解使用 Pyuic5 链接从 .Ui 格式生成的不同 python 文件的方式非常有用,Pyuic5 是从 Qt Designer 进一步生成的。这个视频是针对 PyQt5 的,解释一下就明白了。

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多