Форум сайта python.su
Всем добрый вечер!
В общем, имеем:
Python 3.4
PyQt4
fdb.
Подскажите, как вывести результат запроса в QTableView.
Мои действия, создаю коннект к базе, делаю выборку из базы селектом в курсор, а вот как данные из курсора вывести в таблицу затык. Понимаю, что нужно создать модель данных, но вот какую (пробывал создавать модель от QAbstractTableModel). Извиняюсь, что без примера, завтра если нужно могу кинуть набросок проекта.
Если у кого есть небольшой пример, буду очень благодарен.
Офлайн
QSqlQueryModel, если есть соотв. QSqlDriver
если нет QStandardItemModel->QTableView
Отредактировано vic57 (Март 22, 2017 19:56:13)
Офлайн
vic57Спасиб, почти помог а вернее по совету стал читать про QStandardItemModel, в нескольких источниках писали, что это не правильный путь (много мороки) и надо использовать специально придуманный для этого класс QAbstractTableModel (значит, я правильно шел). Сегодня поглубже поизучав Qt и до меня дошло как все работает (в мануалах обычно сделай это и это и получи вот это, а почему надо делать так …. редко где сказанно).
QSqlQueryModel, если есть соотв. QSqlDriverесли нет QStandardItemModel->QTableView
#!-*-coding:utf-8-*- import sys import fdb # import PyQt4 QtCore and QtGui modules from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4 import uic (Ui_MainWindow, QMainWindow) = uic.loadUiType('Sql_grid.ui') class MainWindow(QMainWindow): """MainWindow inherits QMainWindow""" def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) def __del__(self): self.ui = None class TableSql(QAbstractTableModel): def __init__(self, strings): QAbstractTableModel.__init__(self) self._stringList = strings def rowCount(self, parent=QModelIndex()): return len(self._stringList) def columnCount(self, parent=QModelIndex()): return len(self._stringList[0]) def data(self, index, role): if index.isValid and index.row() < len(self._stringList): if role == Qt.DisplayRole or role == Qt.EditRole: return self._stringList[index.row()][index.column()] pass #-----------------------------------------------------# if __name__ == '__main__': # create application app = QApplication(sys.argv) app.setApplicationName('test_my') # create widget w = MainWindow() w.setWindowTitle('test_my') con = fdb.connect(dsn='/firebird/2.5/data/employee.fdb', user='SYSDBA', password='123456', charset='UTF8') cur = con.cursor() cur.execute("SELECT r.EMP_NO, r.CHANGE_DATE, r.UPDATER_ID, r.OLD_SALARY," "r.PERCENT_CHANGE,r.NEW_SALARY FROM SALARY_HISTORY r") result = cur.fetchall() model = TableSql(result) w.ui.tableView.setModel(model) w.show() # connection QObject.connect(app, SIGNAL('lastWindowClosed()'), app, SLOT('quit()')) # execute application sys.exit(app.exec_())
Отредактировано MrViktor (Март 23, 2017 20:28:28)
Прикреплённый файлы:
Sql_grid.ui (591 байт)
Офлайн
MrViktorв редактируемой таблице легко накосячить. в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог. таблица - чисто отображение результата запроса
Дальше буду двигаться в сторону редактируемой модели
Отредактировано vic57 (Март 24, 2017 14:35:07)
Офлайн
vic57На счет этого я знаю, это чисто обучающий момент (для понимания всей схемы модель представление).
Офлайн
Попадался на глаза проектик, который можно взять в качестве исходной точки. Я так понимаю, он заброшен и сыроват.
Офлайн
vic57Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог
Офлайн
Shamanприоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
Офлайн
vic57Правильно, платят за количество выполненной работы, которой при должной ответственности и необходимой эргономичности на единицу времени получается больше.
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Офлайн
ShamanСпасибо за ссылку, пока мельком глянул, это для работы с SQLAlchemy (я ее пока не научился готовить , но стремлюсь).
Попадался на глаза проектик, который можно взять в качестве исходной точки. Я так понимаю, он заброшен и сыроват.
Shaman
Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
vic57Тут Вы оба правы (каждый по своему), все зависит от конкретной задачи, к примеру табель рабочего времени удобней в таблице пробивать, чем через отдельную форму, а добавление к примеру контрагента или запись какого либо справочника удобней через отдельную форму.
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Офлайн