简体   繁体   English

如何在PyQt5的MainWindow中有效导入用户创建的Widget?

[英]How to efficiently import user created Widget in MainWindow in PyQt5?

Situation 情况

I have created my own widget (It is a group box with a lot of another widgets) called MyWidget using Qt Designer using the following option: 我创建了我自己的小工具(这是一个有很多其他部件的一组框)称为MyWidget使用Qt Designer中使用下列选项:

Qt Designer Option Chosen 选择了Qt Designer选项

After creating the widget, I have added further functionality to it using Python enclosed in file Hello.py . 创建小部件之后,我使用文件Hello.py包含的Python Hello.py添加了更多功能。

In my main code ie mainwindow , I have a combo box and two labels. 在我的主要代码(即mainwindow ,我有一个组合框和两个标签。

My Question 我的问题

Now I would like to import MyWidget (in Hello.py ) in the main code (in Main.py ) such that MyWidget appears just under the combobox in mainwindow . 现在,我想在主代码(在Main.py )中导入MyWidget (在Hello.py中),使MyWidget出现在mainwindowcombobox mainwindow How can I do it efficiently? 我如何有效地做到这一点?

Hello.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 : Anything between the long hash lines is a code added by me to code generated by using the Qt designer. PS :长哈希行之间的所有内容都是我添加到使用Qt设计器生成的代码中的代码。

The answer to this question could be find on the following video: PyQt : Open Other Window When Button Clicked . 在以下视频中可以找到该问题的答案: PyQt:单击按钮时打开其他窗口 This is quite useful for understanding the way to link different python files generated from .Ui format using Pyuic5 which is further generated from Qt Designer. 这对于理解使用Pyuic5链接从.Ui格式生成的不同python文件的方式非常有用,该文件是从Qt Designer进一步生成的。 This video is specific for PyQt5 and the explanation is just strike on. 该视频是针对PyQt5的,其解释不胜枚举。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM