Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QTabWidget不允许我使用自定义类_Python_Oop_Pyqt_Pyqt5_Qt Designer - Fatal编程技术网

Python QTabWidget不允许我使用自定义类

Python QTabWidget不允许我使用自定义类,python,oop,pyqt,pyqt5,qt-designer,Python,Oop,Pyqt,Pyqt5,Qt Designer,编辑:措辞,包括一个最小的可复制的例子 我有一个关于对象名称在PyQt5中如何工作/OOP在PyQt5中如何工作的问题: 背景 我正在做一个项目,其中包括一个QTabWidget。每次单击“+”选项卡时,此QTabWidget都会添加一个新选项卡: 单击之前: 单击后: 当我使用insertNewRegionTab()将新选项卡添加为一个空白小部件时,一切正常;但是,当我改为使用一个自定义类,它是qtwidts.QWidget(customTab)的派生类时,程序崩溃。我创建了这个类,以便每

编辑:措辞,包括一个最小的可复制的例子

我有一个关于对象名称在PyQt5中如何工作/OOP在PyQt5中如何工作的问题:

背景 我正在做一个项目,其中包括一个QTabWidget。每次单击“+”选项卡时,此QTabWidget都会添加一个新选项卡:
单击之前:

单击后:

当我使用
insertNewRegionTab()
将新选项卡添加为一个空白小部件时,一切正常;但是,当我改为使用一个自定义类,它是qtwidts.QWidget(customTab)的派生类时,程序崩溃。我创建了这个类,以便每个选项卡在对象之间具有相同的格式/内部关系,并且我可以使用“+”按钮添加所需的数量

我认为崩溃可能是由于名称冲突,例如在两个选项卡中同时创建一个名为“label1”的标签

问题: 问题是,如果每个customTab都是它自己的对象,我不认为名称冲突会是一个问题。我想知道是否有人知道为什么我不能以期望的方式实现这个customTab类

提议的解决办法 我对解决方案的想法是定义类计数器,然后在每次添加新选项卡时递增,这样它们都有唯一的名称,但这是一项工作,所以我想在实现它之前确保这就是问题所在

代码 注意-使用此代码的两个原始选项卡将没有名称。左边的“test1”中有一个组合框,它位于customTab类中。右边的“+”添加了一个新选项卡,但是添加了一个普通的QWidget而不是customTab对象

从PyQt5导入QtCore、QtGui、qtwidget
类topLevelWindow(QtWidgets.QMainWindow):
定义初始化(自):
#用于添加选项卡的函数
def insertNewRegionTab(自身):
如果self.mainTabWidgetCount==1+self.mainTabWidget.currentIndex():
#尝试的方法1:
tab=QtWidgets.QWidget()#希望这是一个customTab而不是QWidget
self.mainTabWidget.insertTab(self.mainTabWidget.currentIndex(),
tab,“tab”+str(self.mainTabWidgetCount))
#尝试的方法2:
#self.tabinstances.append(customTab(self.mainTabWidget))
self.mainTabWidgetCount+=1
super()。\uuuu init\uuuuu()
#主窗口的初始化
self.setObjectName(“主窗口”)
自我调整大小(500300)
self.centralwidget=qtwidts.QWidget(self)
self.centralwidget.setObjectName(“centralwidget”)
self.gridLayout_5=qtwidts.QGridLayout(self.centralwidget)
self.gridLayout_5.setObjectName(“gridLayout_5”)
#创建主选项卡小部件并设置属性
self.mainTabWidget=QtWidgets.QTabWidget(self.centralwidget)
self.mainTabWidget.setObjectName(“mainTabWidget”)
self.mainTabWidget.setCurrentIndex(0)
self.gridLayout_5.addWidget(self.mainTabWidget,1,1,1)
self.setCentralWidget(self.centralwidget)
#在此选项卡小部件中插入一个选项卡(自定义、预格式化的选项卡类)
self.tabInstances=[customTab(self.mainTabWidget)]
self.mainTabWidgetCount=2
#将创建其他选项卡的选项卡添加到tan小部件
self.addRegionTab=qtwidts.QWidget()
self.addRegionTab.setObjectName(“addRegionTab”)
self.mainTabWidget.addTab(self.addRegionTab,“”)
#添加功能:选择“+”选项卡时,添加选项卡
self.mainTabWidget.currentChanged.connect(lambda:insertNewRegionTab(self))
#橱窗
self.show()
类customTab(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
#初始化对象本身并重命名它。添加垂直布局
超级(customTab,self)。\uuuuu init\uuuuuuu()
self.setObjectName(“tabInstances”)
self.verticalLayout=qtwidts.QVBoxLayout(self)
self.verticalLayout.setObjectName(“verticalLayout”)
self.comboBox1=qtwidts.QComboBox(self)
self.comboBox1.setObjectName(“comboBox1”)
self.comboBox1.addItem(“”)
self.comboBox1.addItem(“”)
#将自己添加到父级
parent.addTab(self,“”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
MainWindow=topLevelWindow()
sys.exit(app.exec_())
我不理解OP的逻辑,因为它询问与问题无关的objectName(),objectName只是一个允许我们识别元素的名称,其他什么都没有

在我的回答中,我展示了如何创建按下时必须添加选项卡的按钮:

from PyQt5 import QtCore, QtGui, QtWidgets


class TabWidget(QtWidgets.QTabWidget):
    plusClicked = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.tabBar().installEventFilter(self)

        self.add_button = QtWidgets.QToolButton(self, text="+")
        self.add_button.clicked.connect(self.plusClicked)

    def eventFilter(self, obj, event):
        if obj is self.tabBar() and event.type() == QtCore.QEvent.Resize:
            r = self.tabBar().geometry()
            h = r.height()
            self.add_button.setFixedSize((h - 1) * QtCore.QSize(1, 1))
            self.add_button.move(r.right(), 0)
        return super().eventFilter(obj, event)


class topLevelWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # Initialization of main window
        self.setObjectName("MainWindow")
        self.resize(500, 300)
        self.centralwidget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.centralwidget)

        lay = QtWidgets.QGridLayout(self.centralwidget)

        # Create the main tab widget and set properties
        self.mainTabWidget = TabWidget()
        self.mainTabWidget.setObjectName("mainTabWidget")
        self.mainTabWidget.setCurrentIndex(0)
        lay.addWidget(self.mainTabWidget, 1, 1, 1, 1)

        self.mainTabWidget.addTab(CustomWidget(), "Tab1")
        self.mainTabWidget.plusClicked.connect(self.add_clicked)

    def add_clicked(self):
        index = self.mainTabWidget.count() + 1
        self.mainTabWidget.addTab(CustomWidget(), "Tab {}".format(index))


class CustomWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        # Initializes the object itself and renames it. Add vertical layout to it
        super(CustomWidget, self).__init__(parent)

        self.comboBox1 = QtWidgets.QComboBox()
        self.comboBox1.addItems(list("abcdef"))

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.comboBox1)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = topLevelWindow()
    w.show()

    sys.exit(app.exec_())

请提供一个感谢,刚刚更新这正是我要找的!明天我会更仔细地看一看代码,但从运行它和尝试功能我可以看到它正在做我试图做的事情。谢谢(编辑:我不能投票,因为我还没有15个代表,但我很感激!)你检查了谁的答案?您可以获得2rep并给予响应者15次代表。请单击✓ 按钮。@Haru刚刚单击了“检查”按钮