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