pyqt4 QTabWidget 添加标签不成功

pyqt4 QTabWidget addtab unsuccessful

我用的是pyqt4,这是我的代码

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class View(QWidget):
    def __init__(self):
        super(View, self).__init__()

        self.hbox = QHBoxLayout()

        self.study_box = QVBoxLayout()

        self.study_box.addWidget(QLabel('dsadasdasd'))

        self.hbox.addLayout(self.study_box)

        self.setLayout(self.hbox)


class Model(QWidget):
    def __init__(self):
        super(Model, self).__init__()

    def func(self):
        Tab().add_tab('sd')


class Tab(QTabWidget):
    _instance = None

    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = QWidget.__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self):
        super(Tab, self).__init__()
        label = QPushButton('asd')
        self.addTab(label, 'asd')
        #method one,  added successfully
        # label.clicked.connect(lambda: self.add_tab('dsd'))
        #method two,  added unsuccessfully
        label.clicked.connect(lambda: Model().func())

    def add_tab(self, data):
        # for x in range(self.count()):
        #     self.removeTab(0)

        self.addTab(View(), data)
        self.addTab(View(), data)
        self.addTab(View(), data)
        self.setCurrentIndex(1)


class Demo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(0, 25, 2500, 1500)

        wg = QWidget()
        hbox = QHBoxLayout()
        hbox.addWidget(Tab())

        wg.setLayout(hbox)
        self.setCentralWidget(wg)
        self.setWindowState(Qt.WindowMaximized)
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

我的要求是当我点击第一个标签页的按钮时,他应该在界面上添加一个标签页。但是,它没有。我很迷茫。明明是调用了add_tab这个函数,但是并没有把它添加到界面中。 class的结构无法更改,因为这是我在项目中的代码,如何获取实现需求?

您的代码存在以下错误:

  • 根据您在评论中指出的内容,您希望 Tab class 成为单例,但您的代码不是。为了解决这个问题,我使用了 .

  • 继承自QTabWidget的Tabclass没有tabs属性,必须使用addTab

  • Model没有必要继承QWidget,如果你想用它来发出信号,它是一个QObject就足够了,反之,如果你想它是单身人士,您只需将其更改为 class Model(QObject, metaclass=Singleton):.

综合以上,解决方案是:

import sys

from PyQt4.QtCore import QObject, Qt
from PyQt4.QtGui import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QPushButton,
    QTabWidget,
    QVBoxLayout,
    QWidget,
)


class Singleton(type(QObject), type):
    def __init__(cls, name, bases, dict):
        super().__init__(name, bases, dict)
        cls._instance = None

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance


class View(QWidget):
    def __init__(self):
        super(View, self).__init__()
        self.hbox = QHBoxLayout(self)
        self.study_box = QVBoxLayout()
        self.study_box.addWidget(QLabel("dsadasdasd"))
        self.hbox.addLayout(self.study_box)


class Model(QObject, metaclass=Singleton):
    def func(self):
        Tab().add_tab("sd")


class Tab(QTabWidget, metaclass=Singleton):
    def __init__(self):
        super(Tab, self).__init__()
        label = QPushButton("asd")
        self.addTab(label, "asd")
        model = Model()
        label.clicked.connect(model.func)

    def add_tab(self, data):
        index = self.addTab(View(), data)


class Demo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(0, 25, 2500, 1500)
        wg = QWidget()
        hbox = QHBoxLayout(wg)
        hbox.addWidget(Tab())
        self.setCentralWidget(wg)
        self.setWindowState(Qt.WindowMaximized)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

注意:我假设了很多事情来推断您想要实现 MVC 模式(或其变体之一),因为在您的问题中您没有提供很多细节。