PyQT 应用程序 - 在哪里保存数据然后由其他小部件处理?
PyQT application - where to hold data that is then processed by other widgets?
我正在使用 PyQt4 编写一个应用程序来分析从我们的数据采集软件获取的数据。该应用程序将包含一些小部件:
- 一个小部件,用于显示已导入的文件(以及这些文件中的数据通道);此小部件还将包含正在生成数据文件的文件观察器
- 一个小部件,它将在导入某些数据通道时绘制它们
- 执行不同分析并显示该分析结果的多个其他小部件
所有这些小部件都将包含在 QMainWindow 中
所以基本上,主要例程是:生成文件(应用程序外部)-> 将文件导入 pandas 数据框 -> 绘制/分析数据
我不清楚的是应用程序中的哪个位置是实际运行导入功能的最佳位置(因此实际的 pandas 数据帧将保存在哪里)。
对我来说有意义的两个地方是第一个提到的小部件(正在监视/显示已导入内容的文件)或实际的 QMainWindow 本身。
我了解如何告知 QMainWindow 中当前的所有小部件已使用信号/槽导入文件。因此,例如,文件观察器小部件将在每次导入文件时发出信号。这将连接到其他小部件中的插槽,这些小部件会告诉他们更新当前绘图,或运行一些分析,或其他任何东西。
但我遇到的不确定点是如何使导入的数据对当前在 QMainWindow 中的所有小部件可用。这就是我询问导入函数实际应该在哪里运行的意思。
希望我问的很清楚;如果不让我知道。
编辑:
阅读更多关于 Qt 中的 MVC 设计的内容,我不清楚它在这里是否合适。我想让应用程序的各个部分尽可能独立,因此使用 MVC 背后的想法非常有吸引力,但我很难理解在我的案例中如何实现它。我能够找到的所有示例似乎都处理更新,例如,一个 TreeWidget 和一个 ComboBox,这样当一个数据被编辑时,它与另一个数据保持同步(即它们都从数据保存在一个地方)。
在我的例子中,数据本身在导入后从未被任何修改。可以在其上运行分析,但这将独立于每个小部件,并且不会影响已导入到应用程序中的实际原始数据。每个小部件本质上都是独立的,该小部件内发生的任何事情都不会影响应用程序中的任何其他小部件。当前在主应用程序中处于活动状态的每个小部件只需要能够访问已导入的数据,并且需要知道何时添加了新数据(这被设想为与 [=34= 匹配的文件名字典) ]数据帧)
如建议的那样,将数据保留在主应用程序中并连接到每个小部件以指示新数据现在可用是很简单的,所以我知道它是如何工作的。
我只是不太清楚通过 MVC 路线我会得到什么。
您基本上只有一个事件触发,即找到新文件,然后依次启动所有其他进程。因此,您可以将所有代码放在主 window class 中,因为您的过程至少在表面上听起来有些简单。数据将通过 class 变量共享,计时器用于检查文件(并且是唯一的事件触发器)。这会给你一个 main window class 具有类似这样的基本结构(伪代码):
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.build_ui()
self.imported_data = {}
timer = QTimer()
timer.timeout.connect(check_for_files)
timer.start(10000) # periodically check for new files
def build_ui(self):
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
def check_for_files(self):
# check for new files here
if new_file:
self.import_data(file_name)
self.ui.filename_list.addItem(file_name) # add file name widget
self.plot_data(file_name)
def import_data(self, file_name):
# open file and read data to file_data
self.ui.imported_data[file_name] = file_data
def plot_data(self, file_name):
self.ui.graph.add_plot(self.imported_data[file_name])
如果您的程序变大但应该可以工作,那可能会变得很丑陋。如果您想要一个更具可扩展性的设计,其中主要 window、处理和数据在单独的 class 中,您可以签出 model-view-controller design 并将处理放在控制器中 class 和模型中的数据 class.
我正在使用 PyQt4 编写一个应用程序来分析从我们的数据采集软件获取的数据。该应用程序将包含一些小部件:
- 一个小部件,用于显示已导入的文件(以及这些文件中的数据通道);此小部件还将包含正在生成数据文件的文件观察器
- 一个小部件,它将在导入某些数据通道时绘制它们
- 执行不同分析并显示该分析结果的多个其他小部件
所有这些小部件都将包含在 QMainWindow 中
所以基本上,主要例程是:生成文件(应用程序外部)-> 将文件导入 pandas 数据框 -> 绘制/分析数据
我不清楚的是应用程序中的哪个位置是实际运行导入功能的最佳位置(因此实际的 pandas 数据帧将保存在哪里)。
对我来说有意义的两个地方是第一个提到的小部件(正在监视/显示已导入内容的文件)或实际的 QMainWindow 本身。
我了解如何告知 QMainWindow 中当前的所有小部件已使用信号/槽导入文件。因此,例如,文件观察器小部件将在每次导入文件时发出信号。这将连接到其他小部件中的插槽,这些小部件会告诉他们更新当前绘图,或运行一些分析,或其他任何东西。
但我遇到的不确定点是如何使导入的数据对当前在 QMainWindow 中的所有小部件可用。这就是我询问导入函数实际应该在哪里运行的意思。
希望我问的很清楚;如果不让我知道。
编辑:
阅读更多关于 Qt 中的 MVC 设计的内容,我不清楚它在这里是否合适。我想让应用程序的各个部分尽可能独立,因此使用 MVC 背后的想法非常有吸引力,但我很难理解在我的案例中如何实现它。我能够找到的所有示例似乎都处理更新,例如,一个 TreeWidget 和一个 ComboBox,这样当一个数据被编辑时,它与另一个数据保持同步(即它们都从数据保存在一个地方)。
在我的例子中,数据本身在导入后从未被任何修改。可以在其上运行分析,但这将独立于每个小部件,并且不会影响已导入到应用程序中的实际原始数据。每个小部件本质上都是独立的,该小部件内发生的任何事情都不会影响应用程序中的任何其他小部件。当前在主应用程序中处于活动状态的每个小部件只需要能够访问已导入的数据,并且需要知道何时添加了新数据(这被设想为与 [=34= 匹配的文件名字典) ]数据帧)
如建议的那样,将数据保留在主应用程序中并连接到每个小部件以指示新数据现在可用是很简单的,所以我知道它是如何工作的。
我只是不太清楚通过 MVC 路线我会得到什么。
您基本上只有一个事件触发,即找到新文件,然后依次启动所有其他进程。因此,您可以将所有代码放在主 window class 中,因为您的过程至少在表面上听起来有些简单。数据将通过 class 变量共享,计时器用于检查文件(并且是唯一的事件触发器)。这会给你一个 main window class 具有类似这样的基本结构(伪代码):
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.build_ui()
self.imported_data = {}
timer = QTimer()
timer.timeout.connect(check_for_files)
timer.start(10000) # periodically check for new files
def build_ui(self):
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
def check_for_files(self):
# check for new files here
if new_file:
self.import_data(file_name)
self.ui.filename_list.addItem(file_name) # add file name widget
self.plot_data(file_name)
def import_data(self, file_name):
# open file and read data to file_data
self.ui.imported_data[file_name] = file_data
def plot_data(self, file_name):
self.ui.graph.add_plot(self.imported_data[file_name])
如果您的程序变大但应该可以工作,那可能会变得很丑陋。如果您想要一个更具可扩展性的设计,其中主要 window、处理和数据在单独的 class 中,您可以签出 model-view-controller design 并将处理放在控制器中 class 和模型中的数据 class.