【问题标题】:pyqt4 QTabWidget addtab unsuccessfulpyqt4 QTabWidget addtab不成功
【发布时间】:2020-04-19 20:34:00
【问题描述】:

我正在使用 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 函数,但是并没有将它添加到界面中。 类的结构不能更改,因为这是我在项目中的代码,如何获取实现需求?

【问题讨论】:

  • “它的 addTab 不成功”是什么意思?此外,从您的代码来看,res 等于 1 似乎是正确的,因为之前只有一个选项卡(“患者选项卡”)。无论如何,你应该给我们一个minimal, reproducible example,否则很难帮助你。
  • 界面不显示,需要刷新界面吗?
  • 正如我所说,您应该通过提供 MRE 来编辑您的问题(它必须是可重现的,这意味着我们应该能够自己复制、粘贴和运行它),否则我们无法为您提供太多帮助。除此之外,我真的不明白覆盖__new__ 的需要,即使你真的需要,你应该: 1. 解释这种需要,可能用代码/cmets 来证明它是合理的; 2. 请记住,根据您的代码,self._Tab 指的是 ,而不是其新创建的实例。
  • 添加新方法是因为我在很多其他模块中调用了这个类的一个实例,但是他们想共享同一组数据,所以我添加了新方法,以便创建的实例是同一对象的数据,无论它在哪里。我重新编辑了这个问题,这是一个可复制的运行,谢谢
  • 刚才我重新编辑了问题上的代码

标签: python pyqt pyqt4 qtabwidget


【解决方案1】:

您的代码有以下错误:

  • 根据您在 cmets 中的说明,您希望 Tab 类成为单例,但您的代码不是。为了解决这个问题,我使用了my previous answer

  • 继承自QTabWidget的Tab类没有标签属性,必须使用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 模式(或其变体之一),因为在您的问题中您没有提供很多细节。

【讨论】:

  • 我按照你的想法解决了这个问题。原因是我的单例有问题。我用你的方法实现了单例。他工作正常。非常感谢您的帮助。这个问题困扰了我很久。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多