Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4 вывод результата запроса из firebird 2.5 [RSS Feed]

#1 Март 22, 2017 18:52:46

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

Всем добрый вечер!
В общем, имеем:
Python 3.4
PyQt4
fdb.
Подскажите, как вывести результат запроса в QTableView.
Мои действия, создаю коннект к базе, делаю выборку из базы селектом в курсор, а вот как данные из курсора вывести в таблицу затык. Понимаю, что нужно создать модель данных, но вот какую (пробывал создавать модель от QAbstractTableModel). Извиняюсь, что без примера, завтра если нужно могу кинуть набросок проекта.
Если у кого есть небольшой пример, буду очень благодарен.

Офлайн

#2 Март 22, 2017 19:17:40

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

QSqlQueryModel, если есть соотв. QSqlDriver
если нет QStandardItemModel->QTableView

Отредактировано vic57 (Март 22, 2017 19:56:13)

Офлайн

#3 Март 23, 2017 20:25:52

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

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 огромное спасибо за замечание про лайауты, вообще шикарная вещь.

Отредактировано MrViktor (Март 23, 2017 20:28:28)

Прикреплённый файлы:
attachment Sql_grid.ui (591 байт)

Офлайн

#4 Март 24, 2017 14:24:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

MrViktor
Дальше буду двигаться в сторону редактируемой модели
в редактируемой таблице легко накосячить. в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог. таблица - чисто отображение результата запроса
неплохой пример

Отредактировано vic57 (Март 24, 2017 14:35:07)

Офлайн

#5 Март 24, 2017 17:59:17

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

vic57
На счет этого я знаю, это чисто обучающий момент (для понимания всей схемы модель представление).
Сейчас нарабатываю куски примеров, которые потом мне понадобятся. Полностью редактирование, будет очень сложно осуществить (селект ведь по сути только читение, а значит внутри модели нужно будет использовать запросы), да и не кчему это, а так расчитывал редактирование не для базы.
Пример и правда не плох, спасибо.

Офлайн

#6 Март 26, 2017 21:31:22

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

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

Офлайн

#7 Март 26, 2017 21:33:47

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

vic57
в промышленных БД добавление-изменение-удаление записи делается через отдельный диалог
Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.

Офлайн

#8 Март 26, 2017 21:55:53

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

Shaman
При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят

Офлайн

#9 Март 26, 2017 23:08:03

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

vic57
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Правильно, платят за количество выполненной работы, которой при должной ответственности и необходимой эргономичности на единицу времени получается больше.

Офлайн

#10 Март 27, 2017 07:25:50

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

PyQt4 вывод результата запроса из firebird 2.5

Shaman
Попадался на глаза проектик, который можно взять в качестве исходной точки. Я так понимаю, он заброшен и сыроват.
Спасибо за ссылку, пока мельком глянул, это для работы с SQLAlchemy (я ее пока не научился готовить , но стремлюсь).

Shaman
Не всегда. При больших объёмах ввода количество телодвижений оператора максимально минифицируется.
vic57
приоритет имеют достоверность данных и ответственность оператора за ошибки, а не облегчение его работы - за работу деньги платят
Тут Вы оба правы (каждый по своему), все зависит от конкретной задачи, к примеру табель рабочего времени удобней в таблице пробивать, чем через отдельную форму, а добавление к примеру контрагента или запись какого либо справочника удобней через отдельную форму.

Офлайн

  • Начало
  • » GUI
  • » PyQt4 вывод результата запроса из firebird 2.5[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version