gpt4 book ai didi

python - pyqt4 QTabWidget addtab不成功

转载 作者:行者123 更新时间:2023-12-01 06:39:01 25 4
gpt4 key购买 nike

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

最佳答案

您的代码有以下错误:

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

  • 继承自QTabWidget的Tab类没有任何名为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 模式(或其变体之一),因为在您的问题中您没有提供很多细节。

关于python - pyqt4 QTabWidget addtab不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59541967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com