Python 在另一个类中调用并使用在主类中定义的QtabWidget

Python 在另一个类中调用并使用在主类中定义的QtabWidget,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我准备了一个小脚本来说明我的问题。事实上,我希望选项卡1选项卡1中包含的按钮显示选项卡4选项卡4。QTabWidget包含在主类CLASSE_main中,我从类1 CLASSE_1调用它。我做了一些测试,但没有任何效果 以下是脚本: #!/usr/bin/python # -*- coding: utf-8 -*- # Imports PyQt5 ----------------------------------------------------------------------- fr

我准备了一个小脚本来说明我的问题。事实上,我希望选项卡1选项卡1中包含的按钮显示选项卡4选项卡4。QTabWidget包含在主类CLASSE_main中,我从类1 CLASSE_1调用它。我做了一些测试,但没有任何效果

以下是脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Imports PyQt5 -----------------------------------------------------------------------
from PyQt5.QtWidgets import (QWidget, QGroupBox, QGridLayout, QVBoxLayout, QMainWindow, 
                             QTabWidget, QWidget, QApplication, QLabel, QPushButton)
# -------------------------------------------------------------------------------------                            

import sys


class CLASSE_1(QWidget) :
    """ """
    
    def __init__(self, parent=None):
        super(CLASSE_1, self).__init__(parent)

        label_classe_1 = QLabel("I'm class 1 label")
        bouton_affichage_tab_4 = QPushButton("setCurrentIndex Tab 4")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_1, 0, 0)
        grid_1.addWidget(bouton_affichage_tab_4, 0, 1)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)
        
        # Signal
        bouton_affichage_tab_4.clicked.connect(self.show_tab_4)
        
    def show_tab_4(self) :
        """ """
        
        from . import CLASSE_Main
        
        cp = CLASSE_Main()
        
        print("dir(cp)", dir(cp))
        #cp.tab_widget.setCurrentIndex(3)
        print("cp.get_tabwidget(), type(cp.get_tabwidget())", cp.get_tabwidget(), type(cp.get_tabwidget()))
        # --------------------------------------
        cp.get_tabwidget().setCurrentIndex(3)
        # --------------------------------------
        for cle, valeur in cp.__dict__.items():
            if cle == 'tab_widget' :
                print("valeur :", type(valeur))
                # --------------------------------------
                valeur.setCurrentIndex(3)
                # --------------------------------------


class CLASSE_2(QWidget) :
    """ """
    
    def __init__(self, parent):
        super(CLASSE_2, self).__init__(parent)

        label_classe_2 = QLabel("I'm class 2 label")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_2, 0, 0)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)


class CLASSE_3(QWidget) :
    """ """
    
    def __init__(self, parent=None):
        super(CLASSE_3, self).__init__(parent)

        label_classe_3 = QLabel("I'm class 3 label")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_3, 0, 0)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)


class CLASSE_4(QWidget) :
    """ """
    def __init__(self, parent):
        super(CLASSE_4, self).__init__(parent)

        label_classe_4 = QLabel("I'm class 4 label")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_4, 0, 0)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)


class CLASSE_5(QWidget) :
    """ """
    
    def __init__(self, parent=None):
        super(CLASSE_5, self).__init__(parent)

        label_classe_5 = QLabel("I'm class 5 label")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_5, 0, 0)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)

        
class CLASSE_6(QWidget) :
    """ """
    
    def __init__(self, parent):
        super(CLASSE_6, self).__init__(parent)

        label_classe_6 = QLabel("I'm class 6 label")
        groupe_1 = QGroupBox()
        grid_1 = QGridLayout()
        grid_1.addWidget(label_classe_6, 0, 0)
        groupe_1.setLayout(grid_1)
        layout = QGridLayout()
        layout.addWidget(groupe_1, 0, 0)
        self.setLayout(layout)


class CLASSE_Main(QMainWindow):
    """ Main class """
    
    def __init__(self):
        super(CLASSE_Main, self).__init__()

        self.setWindowTitle('Help me please !')

        self.setGeometry(20, 40, 600, 400)
        self.setMinimumSize(600, 460)

        self.tab_widget = QTabWidget()

        self.win_widget_1 = CLASSE_1(self)
        self.win_widget_2 = CLASSE_2(self)
        self.win_widget_3 = CLASSE_3(self)
        self.win_widget_4 = CLASSE_4(self)
        self.win_widget_5 = CLASSE_5(self)
        self.win_widget_6 = CLASSE_6(self)
        
        widget = QWidget()

        layout = QVBoxLayout(widget)
        
        self.tab_widget.addTab(self.win_widget_1, "Tab 1")
        self.tab_widget.addTab(self.win_widget_2, "Tab 2")
        self.tab_widget.addTab(self.win_widget_3, "Tab 3")
        self.tab_widget.addTab(self.win_widget_4, "Tab 4")
        self.tab_widget.addTab(self.win_widget_5, "Tab 5")
        self.tab_widget.addTab(self.win_widget_6, "Tab 6")

        self.tab_widget.setStyleSheet("""QTabWidget::tab-bar {alignment: center;}""")

        layout.addWidget(self.tab_widget)

        self.setCentralWidget(widget)
        
    def get_tabwidget(self) :
        """ """
        return self.tab_widget


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CLASSE_Main()
    ex.show()
    sys.exit(app.exec_())
说明: 不必导入在同一脚本中定义的类,因此从中删除。主要进口类别

另一方面,尽管代码不再抛出异常,但您还有另一个问题:cp不是ex,因为它们是两个不同的对象

解决方案: 一种可能的解决方案是创建一个信号,用于发送要在QTabWidget中显示的新索引的信息,并将该信号链接到正确的QTabWidget的setCurrentIndex方法:

from PyQt5.QtCore import pyqtSignal
说明: 不必导入在同一脚本中定义的类,因此从中删除。主要进口类别

另一方面,尽管代码不再抛出异常,但您还有另一个问题:cp不是ex,因为它们是两个不同的对象

解决方案: 一种可能的解决方案是创建一个信号,用于发送要在QTabWidget中显示的新索引的信息,并将该信号链接到正确的QTabWidget的setCurrentIndex方法:

from PyQt5.QtCore import pyqtSignal

谢谢你的回答。事实上,在这个例子中,我已经尽可能地简化来说明这个问题。。。但实际上,主类和其他类在单独的脚本中。@ekdmekdm即使这样,我的解决方案也应该继续工作,您测试过了吗?测试完成了,它工作了!我会在几个小时后把它放在我的主程序中,现在我得睡觉了。无论如何,万分感谢!我刚刚在我的主程序中修改了你的代码,效果很好!我来看看pyqtSignal,看看它是如何工作的,因为它非常非常有用。我将设法找到有关这方面的法语文档。我再次表示感谢!谢谢你的回答。事实上,在这个例子中,我已经尽可能地简化来说明这个问题。。。但实际上,主类和其他类在单独的脚本中。@ekdmekdm即使这样,我的解决方案也应该继续工作,您测试过了吗?测试完成了,它工作了!我会在几个小时后把它放在我的主程序中,现在我得睡觉了。无论如何,万分感谢!我刚刚在我的主程序中修改了你的代码,效果很好!我来看看pyqtSignal,看看它是如何工作的,因为它非常非常有用。我将设法找到有关这方面的法语文档。我再次表示感谢!
class CLASSE_Main(QMainWindow):
    """ Main class """

    def __init__(self):
        super(CLASSE_Main, self).__init__()

        # ...

        self.setCentralWidget(widget)

        self.win_widget_1.customSignal.connect(self.tab_widget.setCurrentIndex)