跨 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()
编辑:更改标题,解决了代码中的一些错误(现在工作正常)
我尝试制作的 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()