Я представил древовидное изображение в графическом интерфейсе программы, которую я создаю, и с тех пор, как он сработает, когда я пытаюсь изменить свою модель после ее установки.Ошибка 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.
Не ссылайтесь на Github или другие внешние сайты. Поместите весь свой код здесь на SO, чтобы будущие читатели могли прочитать версию, которая фактически вызвала проблему. Чтение отрывков, которые вы нам дали, вряд ли выявит проблему, поэтому шансы получить хороший ответ от нас очень малы. Вот почему вы должны сделать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), который мы можем просто скопировать-вставить-запустить. Удалите весь несвязанный код, пока не исчезнет самая маленькая программа, демонстрирующая ошибку. Есть хороший шанс, что вы сами найдете это решение. – titusjan
В моем опыте большинство аварий можно избежать, явно отключив сигналы объекта до его удаления. [Эта страница] (http://enki-editor.org/2014/08/23/Pyqt_mem_mgmt.html), где я читал об этом. – titusjan
Я попытался воспроизвести проблему в отдельном проекте, но он вел себя так, как должен. Также я не получаю сообщение об ошибке или ошибке, просто чистая авария. Кроме того, при отладке в коде строка, вызывающая 'model.clean() 'модель доступна, и я могу прочитать ее элементы, поэтому я не знаю, в чем проблема. Также все выполняется на основном потоке. –