helm2004
QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)
Вы Используете QTableWidget, заполняя его данными на все 100000 строк. То есть сначала запрос вытягивается с сервера, потом вы по нему проходите циклом 100000, заполняя QTableWidget. Это естественно очень долго.
при использовании QTableView и модели заполнения 100000 строк для виджета не происходит. Заполняется только видимая часть. Разберитесь с MVC.
вот простейший пример для мускуля, настройтесь на свою БД, попробуйте
у меня 4500000 строк отображаются через 35 сек (для первого запуска, а потом - через 8)
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import *
from PyQt4.QtSql import *
from PyQt4.QtCore import *
import time
class zzCursorModel(QAbstractTableModel):
def __init__(self, selectSql, headerString=""):
QAbstractTableModel.__init__(self)
self.selectSql=selectSql
self.columns=selectSql.split("select")[1].split("from")[0].strip().split(",")
self.columncount=len(self.columns)
self.headers=[]
if headerString<>"": self.headers=headerString.split("|")
while len(self.columns)>len(self.headers):
self.headers.append(self.columns[len(self.headers)])
self.sqlCursor=QSqlQuery()
self.sqlCursor.exec_(selectSql)
self.sqlCursor.last()
self.rowcount=self.sqlCursor.at()+1
print self.rowcount
def rowCount(self,parent): return self.rowcount
def columnCount(self,parent): return self.columncount
def data(self, index, role=Qt.DisplayRole):
if not index.isValid(): return QVariant()
if role == Qt.DisplayRole:
self.sqlCursor.seek(index.row())
return QVariant(self.sqlCursor.record().value(index.column()).toString())
else:
return QVariant()
def headerData(self, col, orientation, role=Qt.DisplayRole):
## тут задаются заголовки
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(QString(self.headers[col]))
if orientation == Qt.Vertical and role == Qt.DisplayRole:
return QVariant("%s" % col)
elif role == Qt.TextAlignmentRole:
return QVariant(Qt.AlignCenter)
return QVariant()
if __name__ == "__main__":
app = QApplication(sys.argv)
db=QSqlDatabase.addDatabase("QMYSQL")
db.setDatabaseName("x2_mysql")
db.setHostName("localhost")
db.setPassword("")
db.setPort(3306)
db.setUserName("one")
db.open()
d=time.clock()
model = zzCursorModel("select uid from otgr", "U I D")
view = QTableView()
view.setModel(model)
view.show()
print time.clock()-d
sys.exit(app.exec_())