2015-01-07 7 views
0

Я пишу приложение с использованием PyQt4 для анализа данных, полученных из нашего программного обеспечения для сбора данных. Приложение будет состоять из нескольких виджетов:Приложение PyQT - где хранить данные, которые затем обрабатываются другими виджетами?

  • виджет для отображения файлов, которые были импортированы (и какие каналы данных находятся в этих файлах); этот виджет будет также содержать наблюдателя файлов, который ищет файлы данных по мере их создания
  • виджет, который будет отображать определенные каналы данных при их ввозе
  • несколько других виджетов, которые выполняют различный анализ и отображают результаты этого анализа

Все эти виджеты будут содержаться в QMainWindow

Так в основном, главная программа будет: созданный файл (внешние по отношению к приложению) -> файл импортируется в панд dataframe -> данные, представленные/проанализированы

Я не понимаю, где в приложении было бы лучшее место для фактической работы функции импорта (и, следовательно, там, где будут сохраняться фактические кадры данных pandas).

Два места, которые имеют для меня смысл, либо находятся в первом упомянутом виджете (том, который выполняет просмотр/отображение файла импортированного файла), либо самом самом QMainWindow.

Я понимаю, как сообщить всем виджетам, находящимся в настоящее время в QMainWindow, что файл был импортирован с использованием сигналов/слотов. Так, например, виджет хранителя файлов будет выдавать сигнал каждый раз, когда файл импортируется. Это будет связано с слотами в других виджетах, которые скажут им обновить текущий график или запустить какой-либо анализ или что-то еще.

Но точка неопределенности Я работаю над тем, как сделать импортированные данные доступными для всех виджетов, находящихся в настоящее время в QMainWindow. Это то, что я имею в виду, спросив, где действительно должна выполняться функция импорта.

Надеюсь, что я прошу ясно; если не дайте мне знать.

Edit:

Чтение немного больше о MVC дизайна в Qt, то неясно, мне ли это уместно. Я хотел бы сделать части приложения максимально независимыми, поэтому идея использования MVC очень привлекательна, но мне сложно понять, как это будет реализовано в моем случае. Все примеры, которые я смог найти, похоже, связаны с обновлением, например TreeWidget и ComboBox, так что, когда данные для одного редактируются, он остается синхронизированным с данными для другого (т. Е. Оба они меняются с тех пор данные хранятся в одном месте).

В моем случае сами данные никогда не изменяются ничем после его импорта. Анализ может выполняться на нем, но это будет независимым от каждого виджета и не повлияет на фактические исходные данные, которые были импортированы в приложение. Каждый виджет по существу независим, причем все, что происходит внутри этого виджета, не влияет на какой-либо другой виджет приложения.Каждый виджет, активный в основном приложении, просто должен иметь доступ к импортированным данным и должен знать, когда был добавлен новый кусок данных (это предполагается как словарь имен файлов, сопоставленных с файловыми кадрами pandas)

Как было предложено, данные хранятся в главном приложении и подключаются к каждому из виджетов, чтобы показать, что новая часть данных теперь доступна прямолинейно, поэтому я понимаю, как это будет работать.

Я просто очень не понимаю, что я получу, пройдя по маршруту MVC.

ответ

1

У вас по существу есть только одно событие, в котором находится новый файл, и каждый другой процесс запускается по очереди. Поэтому вы можете просто поместить весь код в свой класс основного окна, учитывая, что ваш процесс по крайней мере на поверхности звучит несколько просто. Данные будут передаваться через переменную класса, а таймер используется для проверки файлов (и является единственным триггером события). Это даст вам главный класс окна с основной структурой что-то вроде этого (псевдокод):

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]) 

Это может получить уродливые, если ваша программа становится все больше, но должно работать. Если вам нужен более масштабируемый дизайн, где основное окно, обработка и данные находятся в отдельных классах, вы можете проверить model-view-controller design и поместить обработку в класс контроллера и данные в классе модели.

+0

Спасибо. Я буду больше смотреть на идею дизайна MVC, так как это приложение, скорее всего, будет расти довольно быстро, как только я получу основные его аспекты. – user3014097

+0

См. Edit в OP, так как комментарий является точкой разъяснения, которая слишком длинная для ввода здесь. – user3014097

+0

@ user3014097 MVC - это всего лишь один из многих шаблонов проектирования, которые могут удовлетворить ваше приложение, так как он хорошо зарекомендовал себя для разделения пользовательских входов, логики и хранения данных. Похоже, вы немного смущены между шаблоном проектирования MVC (как в ссылке) и реализацией Qt представлений и моделей в некоторых своих виджетах; эти два не совсем то же самое (и последнее не так важно для моего ответа). Простой путь к попытке MVC будет следовать шаблону в ссылке и понимать минимальный поток процесса через программу. – 101