PyQt5 - строки SQL, скопированные из sqlite3 в QTableWidget, не отображаются

Я работаю над небольшим поисковым приложением в Python/PyQt5, которое погружается в удаленную базу данных SQL, отправляет результаты в локальный файл базы данных, а затем выводит строки из файла базы данных в объект QTableWidget. Приложение запускается, создает локальный файл базы данных, но в объекте QTableWidget ничего не отображается. Я отдельно протестировал часть кода, которая вставляет строки в QTableWidget, и она работает. Так что я не слишком уверен, что искать дальше. PS. Я знаю, что общий дизайн громоздкий, но я новичок в Python, и это лучшее, что я мог придумать.



person Reginald    schedule 17.03.2020    source источник
comment
Я не могу использовать odbc прямо сейчас, поэтому я не могу протестировать ваш код (в будущем всегда старайтесь предоставить минимальный , воспроизводимый пример), но он считает, что вы пропустили commit в DB_Local_Cursor после execute(DB_Connect_Local_Insert_Command).   -  person musicamante    schedule 17.03.2020
comment
Спасибо. Я думаю, что 1 фиксации после цикла по таблице достаточно. В конце концов, я могу открыть локальный файл базы данных в браузере SQL Lite (sqlitebrowser.org), и все значения там. На самом деле это просто сетка QTableWidgetItem, которая остается пустой.   -  person Reginald    schedule 17.03.2020
comment
Да, этого может быть достаточно; немного сложно читать ваш код, слишком много заглавных и похожих имен переменных, что может сильно сбивать с толку. В любом случае предоставьте минимальный воспроизводимый пример, поскольку я вижу, что вы создаете новый tablewidget, но никогда не добавляете это к интерфейсу и боюсь что проблема как раз в нем.   -  person musicamante    schedule 17.03.2020
comment
Спасибо. Это разрешено с помощью self.ui.db_local_tableWidget, а не db_local_tableWidget. Тем не менее, я буду следовать вашему совету относительно имен переменных и номенклатуры. Вы предоставили хорошие идеи.   -  person Reginald    schedule 18.03.2020


Ответы (1)


По общему признанию, я не очень разбираюсь в QT, но вот как я заполняю QTableWidget:

(Я скорректировал свой код на основе вашего примера)

Я использую дизайнер QT для создания формы, содержащей QTableWidget с 4 столбцами. Затем я добавляю строки одну за другой следующим образом:

# add row
row_num = db_local_tableWidget.rowCount()
db_local_tableWidget.insertRow(row_num)
db_local_tableWidget.setItem(row_num , 0, QTableWidgetItem(value1))
db_local_tableWidget.setItem(row_num , 1, QTableWidgetItem(value2))
db_local_tableWidget.setItem(row_num , 2, QTableWidgetItem(value3))
db_local_tableWidget.setItem(row_num , 3, QTableWidgetItem(value4))
db_local_tableWidget.resizeColumnsToContents()

Я не думаю, что вы должны делать это:

db_local_tableWidget.setRowCount(200)
db_local_tableWidget.setColumnCount(6)

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

Я не проверял остальную часть кода, но вы должны добавить некоторый отладочный вывод, либо войти в консоль, либо в файл, используя класс logger. Сначала убедитесь, что ваш код с двойным for loop действительно выполняется, что значения, смещения и т. д. верны. Вы должны быть в состоянии понять легко. Если код работает как положено, но сетка не обновляется, это еще одна проблема.

person Anonymous    schedule 17.03.2020
comment
Хотя теоретически лучше установить количество строк и столбцов в известном объеме данных, в этом нет ничего плохого, и в любом случае это не проблема. - person musicamante; 17.03.2020
comment
Спасибо. Код работает, как и ожидалось, просто не обновляется сетка. Я могу открыть локальный файл базы данных в браузере SQL Lite (sqlitebrowser.org), и все значения/смещения верны. Также попытался закомментировать строки SetRowCount и SetColumnCount, и результат тот же. - person Reginald; 17.03.2020
comment
Возможно, вам следует обращаться к таблице так: self.db_local_tableWidget. Что произойдет, если вы попытаетесь получить доступ к свойствам таблицы, таким как количество строк или столбцов? - person Anonymous; 17.03.2020
comment
Спасибо. В этом была проблема. Я удалил db_local_tableWidget = QTableWidget() и обратился к таблице, как вы предложили - self.db_local_tableWidget - person Reginald; 18.03.2020
comment
Я также полностью исключил локальную базу данных из кода. Слишком громоздко и очень низкая производительность. Просто вызываю метод setItem теперь каждый раз, когда я захожу на удаленный сервер и нахожу совпадение. - person Reginald; 18.03.2020