Python 从预定义布局将选项卡插入QTabWidget

Python 从预定义布局将选项卡插入QTabWidget,python,pyqt,pyside,qt-designer,Python,Pyqt,Pyside,Qt Designer,我正在尝试向我的QTabWidget动态添加选项卡,我想做的简单事情是复制我已经拥有的第一个预设选项卡。现在,在你引导我回答这个问题之前,请听我说完 我不想手动复制该选项卡。我拥有的选项卡是详细的,可以随时对其进行重大更新,我只想在QTDesigner中编辑它,然后动态复制它,或者只是将给定表单插入QTabWidget。我尝试过很多事情(例如:尝试制作一个单独的表单并导入它,设计我自己的tab page类[这很有效,但不是我想要的],从字面上复制tabWidget并尝试添加它),但似乎没有一个能

我正在尝试向我的QTabWidget动态添加选项卡,我想做的简单事情是复制我已经拥有的第一个预设选项卡。现在,在你引导我回答这个问题之前,请听我说完


我不想手动复制该选项卡。我拥有的选项卡是详细的,可以随时对其进行重大更新,我只想在QTDesigner中编辑它,然后动态复制它,或者只是将给定表单插入QTabWidget。我尝试过很多事情(例如:尝试制作一个单独的表单并导入它,设计我自己的tab page类[这很有效,但不是我想要的],从字面上复制tabWidget并尝试添加它),但似乎没有一个能做到这一点

我只需要通过预定义的UI插入一个选项卡

编辑:

通过QtDesigner软件创建表单并将其导出到python文件后,我得到以下代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'newTab.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(810, 672)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.testIdFrame = QtWidgets.QFrame(Form)
        self.testIdFrame.setMinimumSize(QtCore.QSize(0, 622))
        font = QtGui.QFont()
        font.setFamily("Segoe UI Black")
        font.setBold(True)
        font.setItalic(True)
        font.setUnderline(False)
        font.setWeight(75)
        self.testIdFrame.setFont(font)
        self.testIdFrame.setStyleSheet("background: transparent;")
        self.testIdFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.testIdFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.testIdFrame.setObjectName("testIdFrame")
        self.atpDropBox = QtWidgets.QComboBox(self.testIdFrame)
        self.atpDropBox.setGeometry(QtCore.QRect(120, 20, 98, 31))
        self.atpDropBox.setObjectName("atpDropBox")
        self.snLabel = QtWidgets.QLabel(self.testIdFrame)
        self.snLabel.setGeometry(QtCore.QRect(260, 30, 32, 21))
        self.snLabel.setObjectName("snLabel")
        self.workOrderLabel = QtWidgets.QLabel(self.testIdFrame)
        self.workOrderLabel.setGeometry(QtCore.QRect(10, 30, 75, 21))
        self.workOrderLabel.setObjectName("workOrderLabel")
        self.powerSupplyLabel1 = QtWidgets.QLabel(self.testIdFrame)
        self.powerSupplyLabel1.setGeometry(QtCore.QRect(10, 70, 101, 21))
        self.powerSupplyLabel1.setObjectName("powerSupplyLabel1")
        self.snTextEdit = QtWidgets.QTextEdit(self.testIdFrame)
        self.snTextEdit.setGeometry(QtCore.QRect(300, 20, 131, 31))
        self.snTextEdit.setStyleSheet("QTextEdit {\n"
"border: 1px solid black;\n"
"border-radius:5px; \n"
"}")
        self.snTextEdit.setObjectName("snTextEdit")
        self.voltageTextEdit1 = QtWidgets.QTextEdit(self.testIdFrame)
        self.voltageTextEdit1.setGeometry(QtCore.QRect(200, 60, 101, 31))
        self.voltageTextEdit1.setAutoFillBackground(False)
        self.voltageTextEdit1.setStyleSheet("QTextEdit {\n"
"border: 1px solid black;\n"
"border-radius:5px; \n"
"}")
        self.voltageTextEdit1.setObjectName("voltageTextEdit1")
        self.voltageLabel1 = QtWidgets.QLabel(self.testIdFrame)
        self.voltageLabel1.setGeometry(QtCore.QRect(120, 70, 71, 21))
        self.voltageLabel1.setObjectName("voltageLabel1")
        self.voltageLabel2 = QtWidgets.QLabel(self.testIdFrame)
        self.voltageLabel2.setGeometry(QtCore.QRect(120, 110, 71, 21))
        self.voltageLabel2.setObjectName("voltageLabel2")
        self.voltageTextEdit2 = QtWidgets.QTextEdit(self.testIdFrame)
        self.voltageTextEdit2.setGeometry(QtCore.QRect(200, 100, 101, 31))
        self.voltageTextEdit2.setAutoFillBackground(False)
        self.voltageTextEdit2.setStyleSheet("QTextEdit {\n"
"border: 1px solid black;\n"
"border-radius:5px; \n"
"}")
        self.voltageTextEdit2.setObjectName("voltageTextEdit2")
        self.powerSupplyLabel2 = QtWidgets.QLabel(self.testIdFrame)
        self.powerSupplyLabel2.setGeometry(QtCore.QRect(10, 110, 101, 21))
        self.powerSupplyLabel2.setObjectName("powerSupplyLabel2")
        self.currentLabel2 = QtWidgets.QLabel(self.testIdFrame)
        self.currentLabel2.setGeometry(QtCore.QRect(310, 110, 81, 21))
        self.currentLabel2.setObjectName("currentLabel2")
        self.currentLabel1 = QtWidgets.QLabel(self.testIdFrame)
        self.currentLabel1.setGeometry(QtCore.QRect(310, 70, 91, 21))
        self.currentLabel1.setObjectName("currentLabel1")
        self.currentTextEdit1 = QtWidgets.QTextEdit(self.testIdFrame)
        self.currentTextEdit1.setGeometry(QtCore.QRect(400, 60, 101, 31))
        self.currentTextEdit1.setAutoFillBackground(False)
        self.currentTextEdit1.setStyleSheet("QTextEdit {\n"
"border: 1px solid black;\n"
"border-radius:5px; \n"
"}")
        self.currentTextEdit1.setObjectName("currentTextEdit1")
        self.currentTextEdit2 = QtWidgets.QTextEdit(self.testIdFrame)
        self.currentTextEdit2.setGeometry(QtCore.QRect(400, 100, 101, 31))
        self.currentTextEdit2.setAutoFillBackground(False)
        self.currentTextEdit2.setStyleSheet("QTextEdit {\n"
"border: 1px solid black;\n"
"border-radius:5px; \n"
"}")
        self.currentTextEdit2.setObjectName("currentTextEdit2")
        self.verticalLayout.addWidget(self.testIdFrame)
        self.RXFrame = QtWidgets.QFrame(Form)
        self.RXFrame.setStyleSheet("background: transparent;")
        self.RXFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.RXFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.RXFrame.setObjectName("RXFrame")
        self.verticalLayout.addWidget(self.RXFrame)
        self.TXFrame = QtWidgets.QFrame(Form)
        self.TXFrame.setStyleSheet("background: transparent;")
        self.TXFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.TXFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.TXFrame.setObjectName("TXFrame")
        self.verticalLayout.addWidget(self.TXFrame)

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.snLabel.setText(_translate("Form", "SN:"))
        self.workOrderLabel.setText(_translate("Form", "Work Order:"))
        self.powerSupplyLabel1.setText(_translate("Form", "Power Supply 1:"))
        self.voltageLabel1.setText(_translate("Form", "Voltage [V]:"))
        self.voltageLabel2.setText(_translate("Form", "Voltage [V]:"))
        self.powerSupplyLabel2.setText(_translate("Form", "Power Supply 2:"))
        self.currentLabel2.setText(_translate("Form", "Current [mA]:"))
        self.currentLabel1.setText(_translate("Form", "Current [mA]:"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
在我的MainWindow类中,我从新生成的python文件导入Ui_表单,该文件包含我要复制的新选项卡的内容。 这就是我被卡住的地方。。我调用将为我构建选项卡的函数:

def buildTabs(self, numberOfTabs): 
    for dut in range(numberOfTabs): 
        text = ('TAB ' + ascii_uppercase[dut]) 
        self.ui.tabWidget.addTab(Ui_Form(), text)
选项卡小部件位于主窗口的ui中

我不明白如何将Ui_Form()转换为Ui_选项卡页或QWidget,如中所示

QT设计器窗体:


pyuic生成的文件是表单类,它们实际上是标准的python
对象
类,它们需要一个QWidget实例(或该ui的设计器中使用的任何类,如QDialog)来“构建”它们

考虑到PyQt和PySide不能混合使用,因此如果使用PyQt,则命令为
pyuic
,而使用PySide时,命令为
pyside2 uic

请注意,如果需要进一步与选项卡页面交互,通常最好将其子类化:

class PageOne(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.ui.someButton.clicked.connect(self.someFunction)
        # ...
或者更好,使用多重继承方法,避免通过
ui
“子对象”不断访问ui元素:

class PageOne(qtwidts.QWidget,Ui\u表单):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
self.someButton.clicked.connect(self.someFunction)
# ...
然后:

def buildTabs(self, numberOfTabs): 
    for dut in range(numberOfTabs): 
        page = PageOne()
        text = ('TAB ' + ascii_uppercase[dut])
        self.ui.tabWidget.addTab(page, text)
def buildTabs(self,numberOfTabs):
对于范围内的dut(标签号):
page=PageOne()
text=('TAB'+ascii_大写[dut])
self.ui.tabWidget.addTab(页面,文本)

“尝试创建一个单独的表单并导入”:根据您的描述,这正是您所需要的,除了创建一个基于某些信息(按钮数量、组合框中的项目等)动态创建子窗口小部件的类之外。为什么它对你不起作用?这是昨天的事,之后我尝试了很多其他的事情,但如果我没记错的话;它给了我一个错误,因为Ui_表单与QWidget不兼容。可能我在这个过程中做错了什么。我需要一个从QWidget继承的类,但我无法将其用于表单。请在尝试执行此操作的地方共享代码,并添加错误。我已编辑了问题并添加了表单的导入过程。这就是我的问题所在。我昨天对此进行了深入研究,但没有取得任何进展。附言:我对PyQt完全陌生,所以请原谅,在运行上面的代码后,它给了我以下错误:[我还附加了QtDesigner屏幕截图]类型错误:参数与任何重载调用不匹配:QVBoxLayout():参数太多QVBoxLayout(QWidget):参数1具有意外类型“PySide2.qtwidts.QWidget”。如果使用PySide,则不能使用PyQt的pyuic创建文件,因为PyQt和PySide模块不能一起使用。使用pyside自己的命令,我相信是
pyside2 uic
。非常感谢兄弟!我已经尝试了所有这些不同的解决方案,而pyside导入正是我所缺少的。
class PageOne(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.someButton.clicked.connect(self.someFunction)
        # ...
def buildTabs(self, numberOfTabs): 
    for dut in range(numberOfTabs): 
        page = PageOne()
        text = ('TAB ' + ascii_uppercase[dut])
        self.ui.tabWidget.addTab(page, text)