跨 QTabWidgets 传递 infromation/variable 的正确方法?

Proper way to pass an infromation/variable across QTabWidgets?

编辑:更改标题,解决了代码中的一些错误(现在工作正常)

我尝试制作的 GUI 将是一个简单的 QTabWidget,引导用户一个接一个地直接指向最后一个选项卡。

目前,我有三个 *.py 文件 - main.py、tab1.py、tab2.py。在 main.py 中是应用程序的主要 window 和 运行 应用程序的功能(简化只是为了关注我的问题):

import sys
import tab1
import tab2
import PyQt5.QtWidgets as qtw

def main():
    app = qtw.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

class MainWindow(qtw.QmainWindow):
    def __init__(self):
        super().__init__()
        self.tabwidget = qtw.QTabWidget()
        self.setCentralWidget(self.tabwidget)

        self.tab1 = tab1.Tab_1()
        self.tab2 = tab2.Tab_2()

        # This is how I now passing the information from tab1 to tab2
        self.tab1.path_line.textChanged.connect(self.tab2.path_widget.setText)

        self.tabwidget.addTab(self.tab1, 'tab1')
        self.tabwidget.addTab(self.tab2, 'tab2')

if __name__ == '__main__':
    main()

在 tab1.py 中为将用作输入数据选项卡的选项卡小部件定义了 class。有一个按钮可以打开文件对话框,读取文件名,并将路径写入 QLineEdit 小部件:

import PyQt5.QtWidgets as qtw

class Tab_1(qtw.QWidget):
    def __init__(self):
        super().__init__()
        self.path_line = qtw.QLineEdit()
        self.but = qtw.QPushButton('Open')
        self.but.clicked.connect(self.openfile)

        layout_1 = qtw.QVBoxLayout()
        layout_1.addWidget(self.but)
        self.setLayout(layout_1)

    def openfile(self):
        filename, _ = qtw.QFileDialog.getOpenFileName(self, 'Title', 'File types')
        if filename:
            self.path_line.setText(filename)
        else:
            self.path_line.setText('No file was selected!')

现在我想在另一个文件 tab2.py 中使用我从 qtw.OpenFileDialog 获得的路径。所以定义的 class Tab_2() 看起来像这样:

import PyQt5.QtWidgets as qtw

class Tab_2(qtw.QWidget):
    def __init__(self):
        super().__init__()

        # Retrieving the information by QLabel widget
        self.path_widget = qtw.QLabel()
        # Transform the information into string variable
        self.path_string = self.path_widget.text()
        
        layout_2 = qtw.QVBoxLayout()
        layout_2.addWidget(self.path_widget) # The path from QFileDialog (Tab1) should appered on Tab2
        self.setLayout(layout_2)

我的问题是,这是正确的做法吗?我应该使用 MainWindow class 作为信息的“getter”和“传递者”,还是应该在选项卡 classes 本身中实现?它有效,但我不想学习做坏事并最终习惯它。我在某种程度上理解 classes 和它们的继承(很多狗 classes 或员工 classes 的例子,我理解它是如何工作的,但在我的情况下我很困惑。) .结合 GUI,它搞砸了我的头脑。此外,我希望将每个选项卡作为一个单独的 class 放在一个单独的 *.py 文件中,以便将来添加另一个选项卡时更加清晰和容易。我明白了,这可能不是使用 classes 的正确方法,但每个选项卡都有不同的布局。

经过一些测试,我发现在 QTabWidgets 之间传递变量的最佳方式,就我而言,是 class 继承。对于这个想法,感谢@S。来自 Code Review.

的尼克

我有 main.py 用于应用程序的 QMainWindow,然后是另外两个 *.py 文件,每个文件都包含一个 TabWidget class。由于我在 main.py 中创建导入的 Tab 小部件 classes,我的问题的最佳解决方案是将变量保存到 QMainWindow 中,然后通过 Tab classes 通过“ self-parent 东西”。我真的是一个编程初学者,所以我不知道这是否是基础知识。但是通过将变量存储到 parent QMainWindow class 中,我可以通过包含“self”参数从 QMainWindow 中创建的任何小部件 class 访问它。这是我使用的最终代码的方差:

import sys
import PyQt5.QtWidgets as qtw

#from tab1 import Tab_1
class Tab_1(qtw.QWidget):
    """ In this class I obtain a file path """
    def __init__(self, parent=None):                                 # + parent
        super().__init__()
        self.parent = parent                                         # + parent

        self.but_1 = qtw.QPushButton('Open')
        self.but_1.clicked.connect(self.open_file)

        layout_1 = qtw.QVBoxLayout(self)
        layout_1.addWidget(self.but_1)
        self.setLayout(layout_1)

   def open_file(self):
        filename, _ = qtw.QFileDialog.getOpenFileName(self, 'Title', 'File types')
        if filename:
            self.parent.file_path = filename                         # + parent
        else:
            self.parent.file_path = 'No file was selected'           # + parent


#from tab2 import Tab_2
class Tab_2(qtw.QWidget):
    """ In this class I want to use the file path from Tab 1 """
    def __init__(self, parent=None):                                  # + parent
        super().__init__()
        self.parent = parent                                          # + parent

        self.but_2 = qtw.QPushButton('Load path')
        self.but_2.clicked.connect(self._load_path)

        self.path_widget = qtw.QLabel('')                             # will show path to file after the button-click
    
        layout_2 = qtw.QVBoxLayout(self)
        layout_2.addWidget(self.but_2)
        layout_2.addWidget(self.path_widget) 
        self.setLayout(layout_2)
   
    def _load_path(self):
        self.path_widget.setText(self.parent.file_path)


class MainWindow(qtw.QMainWindow):
    def __init__(self):
       super().__init__()
       self.file_path = ''                                          # + file_path
    
       self.tabwidget = qtw.QTabWidget()
       self.setCentralWidget(self.tabwidget)
    
       self.tab1 = Tab_1(self)                                      # + self
       self.tab2 = Tab_2(self)                                      # + self

       self.tabwidget.addTab(self.tab1, 'Tab 1')
       self.tabwidget.addTab(self.tab2, 'Tab 2')
             
        
def main():
    app = qtw.QApplication(sys.argv)
    window = MainWindow()
    window.resize(400, 300)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()