2016-02-27 2 views
0

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

Ход действий:

  • загрузить файл с помощью файлового диалога
  • клиринговой модели на интерфейсных объектов (таблиц и TreeView). В первый раз дерево не затронуто, так как нет модели в .
  • Наполнять модель дерева.
  • другие предметы, не связанные с проблемой.

Проблемные функции: Процедура загрузки файлов:

def open_file(self): 
     """ 
     Open a file 
     :return: 
     """ 
     print("actionOpen_file_click") 
     # declare the dialog 
     # file_dialog = QtGui.QFileDialog(self) 
     # declare the allowed file types 
     files_types = "Excel 97 (*.xls);;Excel (*.xlsx);;DigSILENT (*.dgs);;MATPOWER (*.m)" 
     # call dialog to select the file 
     filename, type_selected = QtGui.QFileDialog.getOpenFileNameAndFilter(self, 'Open file', 
                     self.project_directory, files_types) 

     if len(filename) > 0: 
      self.project_directory = os.path.dirname(filename) 
      print(filename) 
      self.circuit = Circuit(filename, True) 

      # set data structures list model 
      self.ui.dataStructuresListView.setModel(self.available_data_structures_listModel) 
      # set the first index 
      index = self.available_data_structures_listModel.index(0, 0, QtCore.QModelIndex()) 
      self.ui.dataStructuresListView.setCurrentIndex(index) 

      # clean 
      self.clean_GUI() 

      # load table 
      self.display_objects_table() 

      # draw graph 
      self.ui.gridPlot.setTitle(os.path.basename(filename)) 
      self.re_plot() 

      # show times 
      if self.circuit.time_series is not None: 
       if self.circuit.time_series.is_ready(): 
        self.set_time_comboboxes() 

      # tree view at the results 
      self.set_results_treeview_structure() 

      # populate editors 
      self.populate_editors_defaults() 

TreeView модель отведение:

def set_results_treeview_structure(self): 
     """ 
     Sets the results treeview data structure 
     @return: 
     """ 

     # self.ui.results_treeView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) 
     model = QtGui.QStandardItemModel() 
     # model.setHorizontalHeaderLabels(['Elements']) 
     self.ui.results_treeView.setModel(model) 
     # self.ui.results_treeView.setUniformRowHeights(True) 

     def pass_to_QStandardItem_list(list_): 
      res = list() 
      for elm in list_: 
       elm1 = QtGui.QStandardItem(elm) 
       elm1.setEditable(False) 
       res.append(elm1) 
      return res 

     bus_results = pass_to_QStandardItem_list(['Voltages (p.u.)', 'Voltages (kV)']) 
     per_bus_results = pass_to_QStandardItem_list(['Voltage (p.u.) series', 'Voltage (kV) series', 
                 'Active power (MW)', 'Reactive power (MVar)', 
                 'Active and reactive power (MW, MVar)', 'Aparent power (MVA)', 
                 'S-V curve', 'Q-V curve']) 

     branches_results = pass_to_QStandardItem_list(['Loading (%)', 'Current (p.u.)', 
                 'Current (kA)', 'Losses (MVA)']) 
     per_branch_results = pass_to_QStandardItem_list(['Loading (%) series', 'Current (p.u.) series', 
                 'Current (kA) series', 'Losses (MVA) series']) 

     generator_results = pass_to_QStandardItem_list(['Reactive power (p.u.)', 'Reactive power (MVar)']) 
     per_generator_results = pass_to_QStandardItem_list(['Reactive power (p.u.) series', 
                  'Reactive power (MVar) series']) 

     self.family_results_per_family = dict() 

     # nodes 
     buses = QtGui.QStandardItem('Buses') 
     buses.setEditable(False) 
     buses.appendRows(bus_results) 
     self.family_results_per_family[0] = len(bus_results) 
     names = self.circuit.bus_names 
     for name in names: 
      bus = QtGui.QStandardItem(name) 
      bus.appendRows(per_bus_results) 
      bus.setEditable(False) 
      buses.appendRow(bus) 

     # branches 
     branches = QtGui.QStandardItem('Branches') 
     branches.setEditable(False) 
     branches.appendRows(branches_results) 
     self.family_results_per_family[1] = len(branches_results) 
     names = self.circuit.branch_names 
     for name in names: 
      branch = QtGui.QStandardItem(name) 
      branch.appendRows(per_branch_results) 
      branch.setEditable(False) 
      branches.appendRow(branch) 

     # generators 
     generators = QtGui.QStandardItem('Generators') 
     generators.setEditable(False) 
     generators.appendRows(generator_results) 
     self.family_results_per_family[2] = len(generator_results) 
     names = self.circuit.gen_names 
     for name in names: 
      gen = QtGui.QStandardItem(name) 
      gen.appendRows(per_generator_results) 
      gen.setEditable(False) 
      generators.appendRow(gen) 

     model.appendRow(buses) 
     model.appendRow(branches) 
     model.appendRow(generators) 

И GUI "чистка":

def clean_GUI(self): 
     """ 
     Initializes the comboboxes and tables 
     Returns: 

     """ 
     self.ui.tableView.setModel(None) 
     if self.ui.results_treeView.model() is not None: 
      self.ui.results_treeView.model().clear() 

     self.ui.profile_time_selection_comboBox.clear() 
     self.ui.results_time_selection_comboBox.clear() 
     self.ui.gridPlot.clear() 

Полный код можно увидеть here

Я видел, что такое поведение обычно вызвано вызовами за пределами поток GUI, я не думаю, что это так. Буду признателен, если кто-то может указать на проблему. Снова код жалобы для теста - here.

+1

Не ссылайтесь на Github или другие внешние сайты. Поместите весь свой код здесь на SO, чтобы будущие читатели могли прочитать версию, которая фактически вызвала проблему. Чтение отрывков, которые вы нам дали, вряд ли выявит проблему, поэтому шансы получить хороший ответ от нас очень малы. Вот почему вы должны сделать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), который мы можем просто скопировать-вставить-запустить. Удалите весь несвязанный код, пока не исчезнет самая маленькая программа, демонстрирующая ошибку. Есть хороший шанс, что вы сами найдете это решение. – titusjan

+0

В моем опыте большинство аварий можно избежать, явно отключив сигналы объекта до его удаления. [Эта страница] (http://enki-editor.org/2014/08/23/Pyqt_mem_mgmt.html), где я читал об этом. – titusjan

+0

Я попытался воспроизвести проблему в отдельном проекте, но он вел себя так, как должен. Также я не получаю сообщение об ошибке или ошибке, просто чистая авария. Кроме того, при отладке в коде строка, вызывающая 'model.clean() 'модель доступна, и я могу прочитать ее элементы, поэтому я не знаю, в чем проблема. Также все выполняется на основном потоке. –

ответ

0

Решение этой проблемы в моем случае было следующее:

QStandardItemModel() переменная называется модель в коде была превращена в классе глобальной переменной self.tree_model

Когда я хочу, чтобы заменить модель объекта treeview, Я удалить глобальный tree_model с del self.tree_model

Затем я вновь создать глобальную модель с self.tree_model = QStandardItemModel()

Таким образом, объектная модель TreeView эффективно заменяется без сбоев ...

Смежные вопросы