MaratD
Март 13, 2016 16:33:54
Вообще где можно почитать про все это на русском?
Rodegast
Март 13, 2016 16:40:09
> beginResetModel а это что?
beginResetModel - начало перезаполнения данных
endResetModel - конец перезаполнения данных
Эти методы нужны для того что-бы сообщить представлению что данные поменялись.
> Вообще где можно почитать про все это на русском?
Марк Саммерфилд - Qt Профессиональное программирование.
vic57
Март 14, 2016 13:45:22
для новичка QTableWidget проще
#!-*-coding:utf8-*-
from PyQt4 import Qt
def on_find():
s = edit.text()
rows = t.rowCount()
cols = t.columnCount()
for i in xrange(rows):
for j in xrange(cols):
txt = t.item(i,j).text()
if txt.contains(s):
t.setRowHidden(i,False)
break
else:
t.setRowHidden(i,True)
app = Qt.QApplication([])
w= Qt.QWidget()
t = Qt.QTableWidget(w)
t.setRowCount(3)
t.setColumnCount(4)
for i in xrange(3):
for j in xrange(4):
s= 'blabla' + str(i) + str(j)
item = Qt.QTableWidgetItem()
item.setText(s)
t.setItem(i,j,item)
t.setSortingEnabled(True)
edit = Qt.QLineEdit()
btnFind = Qt.QPushButton(u'Поиск',w)
btnFind.clicked.connect(on_find)
grid = Qt.QGridLayout(w)
grid.addWidget(t,0,0,1,2)
grid.addWidget(edit,1,0)
grid.addWidget(btnFind,1,1)
w.resize(500,300)
w.move(0,0)
w.show()
app.exec_()
Прохоренок Н.А. погугли. PyQt там доступно описано
MaratD
Март 15, 2016 08:40:02
<для новичка QTableWidget проще>
да проще, но я читал что он тормозит при большой таблице и много памяти требует. А у меня большая таблица. И QTableView все равно тормозит. Видимо я что-то не дописал в своем коде. Или неправильно написал.
Прохоренок читал, нет примеров, просто теория.
Rodegast
Март 15, 2016 09:38:45
vic57 Ты бы сначала ООП выучал и только потом что-то писать пытался.
> Прохоренок Н.А. погугли. PyQt там доступно описано
Это отвратительная книга. Ничего хорошего кроме тупого перевода документации в ней нет.
> Видимо я что-то не дописал в своем коде. Или неправильно написал.
Вкладывай код ещё раз. Посмотрю что там может быть не так.
MaratD
Март 15, 2016 12:57:32
код тот же, ничего нового не придумал
'''
Created on 8 марта 2016 г.
import sys
from PyQt5.QtCore import QAbstractTableModel, Qt, QSortFilterProxyModel, QVariant
from PyQt5.QtWidgets import QMainWindow, QTableView, QApplication
from dbf.ver_33 import Table
class Model(QAbstractTableModel):
def __init__(self, parent):
QAbstractTableModel.__init__(self)
self.gui = parent
def rowCount(self, parent):
return 10000
def columnCount(self, parent):
return 10
def data(self, index, role):
db = Table(r“E:\NOMEN”)
db.open()
if not index.isValid():
return 11
if role == Qt.DisplayRole:
row = index.row()
col = index.column()
if row in range(10000):
if col == 0:
return row
if col == 1:
return db.naimn
db.close()
def headerData(self, section, orientation, role):
if orientation == Qt.Vertical and role == Qt.DisplayRole:
return “Заголовок №1”
return QVariant()
class MainWindow(QMainWindow):
def __init__(self, parent):
QMainWindow.__init__(self, parent)
self.table = QTableView(self)
self.model = Model(self.table)
self.table.setModel(self.model)
self.setCentralWidget(self.table)
class App(QApplication):
def __init__(self, argv):
QApplication.__init__(self, argv)
self.ui = MainWindow(None)
self.ui.show()
if __name__ == “__main__”:
app = App(sys.argv)
sys.exit(app.exec_())
MaratD
Март 15, 2016 12:58:28
извиняюсь
Created on 8 марта 2016 г.
import sys
from PyQt5.QtCore import QAbstractTableModel, Qt, QSortFilterProxyModel, QVariant
from PyQt5.QtWidgets import QMainWindow, QTableView, QApplication
from dbf.ver_33 import Table
class Model(QAbstractTableModel):
def __init__(self, parent):
QAbstractTableModel.__init__(self)
self.gui = parent
def rowCount(self, parent):
return 10000
def columnCount(self, parent):
return 10
def data(self, index, role):
db = Table(r“E:\NOMEN”)
db.open()
if not index.isValid():
return 11
if role == Qt.DisplayRole:
row = index.row()
col = index.column()
if row in range(10000):
if col == 0:
return row
if col == 1:
return db.naimn
db.close()
def headerData(self, section, orientation, role):
if orientation == Qt.Vertical and role == Qt.DisplayRole:
return “Заголовок №1”
return QVariant()
class MainWindow(QMainWindow):
def __init__(self, parent):
QMainWindow.__init__(self, parent)
self.table = QTableView(self)
self.model = Model(self.table)
self.table.setModel(self.model)
self.setCentralWidget(self.table)
class App(QApplication):
def __init__(self, argv):
QApplication.__init__(self, argv)
self.ui = MainWindow(None)
self.ui.show()
if __name__ == “__main__”:
app = App(sys.argv)
sys.exit(app.exec_())
MaratD
Март 15, 2016 13:01:33
если не трудно на 4 странице гляньте, я его выкладывал )
ПОЖАЛУЙСТА
Rodegast
Март 15, 2016 13:52:29
> код тот же, ничего нового не придумал
Ну тогда попробую объяснить. Вот в чём твоя проблема:
def data(self, index, role):
db = Table(r"E:\NOMEN")
db.open()
if not index.isValid():
return 11
if role == Qt.DisplayRole:
row = index.row()
col = index.column()
if row in range(10000):
if col == 0:
return row
if col == 1:
return db[row].naimn
db.close()
Метод data вызывается несколько раз для каждого индекса (ячейки) при отрисовки виджита (отрисовываются только видимые ячейки). По этому он должен работать как можно быстрее, а у тебя там идёт работа с БД, которая не может быть быстрой и как следствие всё будет тормозить, особенно при прокрутки. По этому перед заполнением виджита тебе надо считать данные в буфер.
MaratD
Март 15, 2016 19:29:53
я думал один раз загрузится и база закроется.
Тогда в чем преимущество модели.