Найти - Пользователи
Полная версия: PyQt4 вывод результата запроса из firebird 2.5
Начало » GUI » PyQt4 вывод результата запроса из firebird 2.5
1
MrViktor
Всем добрый вечер!
В общем, имеем:
Python 3.4
PyQt4
fdb.
Подскажите, как вывести результат запроса в QTableView.
Мои действия, создаю коннект к базе, делаю выборку из базы селектом в курсор, а вот как данные из курсора вывести в таблицу затык. Понимаю, что нужно создать модель данных, но вот какую (пробывал создавать модель от QAbstractTableModel). Извиняюсь, что без примера, завтра если нужно могу кинуть набросок проекта.
Если у кого есть небольшой пример, буду очень благодарен.
vic57
QSqlQueryModel, если есть соотв. QSqlDriver
если нет QStandardItemModel->QTableView
MrViktor
vic57
QSqlQueryModel, если есть соотв. QSqlDriverесли нет QStandardItemModel->QTableView
Спасиб, почти помог а вернее по совету стал читать про QStandardItemModel, в нескольких источниках писали, что это не правильный путь (много мороки) и надо использовать специально придуманный для этого класс QAbstractTableModel (значит, я правильно шел). Сегодня поглубже поизучав Qt и до меня дошло как все работает (в мануалах обычно сделай это и это и получи вот это, а почему надо делать так …. редко где сказанно).
Так вот, опытных я конечно же не удивлю, а для новичков може пригодится.
Для реализации не редактируемой модели необходимо реализовать в своем классе наследуемом от QAbstractTableModel четыре метода, rowCount(), columnCount(), headerData() и data(), данные методы вызываются представлением в моем случае QTableView. Первые два метода должны возвращать размер данных (таблицы) количество строк и колонок соответственно, тоесть если наша таблица имеет 10 строк и 2 столбца, то предствавлением метод data() будет вызван 20 раз (один раз для каждой ячейки). Метод headerData() не обязателен, необходим для формирования заголовков.
Уффф… на данный момент читаю много доков (по python, Qt, firebird, SQLAlchimy) так, что если пишу очевидные вещи, сильно не пинать (в голове бордак).

 #!-*-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_())
Базу использовал тестовую из поставки firebird.
Дальше буду двигаться в сторону редактируемой модели. Rodegast огромное спасибо за замечание про лайауты, вообще шикарная вещь.
vic57
MrViktor
Дальше буду двигаться в сторону редактируемой модели
в редактируемой таблице легко накосячить. в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог. таблица - чисто отображение результата запроса
неплохой пример
MrViktor
vic57
На счет этого я знаю, это чисто обучающий момент (для понимания всей схемы модель представление).
Сейчас нарабатываю куски примеров, которые потом мне понадобятся. Полностью редактирование, будет очень сложно осуществить (селект ведь по сути только читение, а значит внутри модели нужно будет использовать запросы), да и не кчему это, а так расчитывал редактирование не для базы.
Пример и правда не плох, спасибо.
Shaman
Попадался на глаза проектик, который можно взять в качестве исходной точки. Я так понимаю, он заброшен и сыроват.
Shaman
vic57
в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог
Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
vic57
Shaman
При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Shaman
vic57
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Правильно, платят за количество выполненной работы, которой при должной ответственности и необходимой эргономичности на единицу времени получается больше.
MrViktor
Shaman
Попадался на глаза проектик, который можно взять в качестве исходной точки. Я так понимаю, он заброшен и сыроват.
Спасибо за ссылку, пока мельком глянул, это для работы с SQLAlchemy (я ее пока не научился готовить , но стремлюсь).

Shaman
Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
vic57
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Тут Вы оба правы (каждый по своему), все зависит от конкретной задачи, к примеру табель рабочего времени удобней в таблице пробивать, чем через отдельную форму, а добавление к примеру контрагента или запись какого либо справочника удобней через отдельную форму.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB