Форум сайта python.su
Думал сам разберусь, но видно не судьба. Объясните пожалуйста зачем так сложно МОДЕЛЬ-ПРЕДСТАВЛЕНИЕ? Нельзя просто МОДЕЛЬ и работать с ней? Никак не пойму эту методологию. Для чего нужна модель и для чего нужно представление? И как сохранять изменения в базену база данных по простому это двумерная таблица, или набор таблиц. может быть большой.
Офлайн
0
Здравствуйте, уважаемые разработчики.
Модель (QAbstractTableModel) у меня 10 столбцов и 10000 строк. Данные загрузил с dbf файла во второй столбец. То есть получается даже не таблица , а один столбец на 10000 строк. Представление у меня таблица QTableView.
Делегатов нет. Никаких сигналов и слотов. Пытаюсь просматривать эту таблицу, комп зависает и тормозит. Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon? Как тогда работать с полной таблицей (20000 строк и 10 столбцов)?
Спасибо.
Офлайн
186
> Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon?
Нет. Код в студию!
Офлайн
0
''' 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[row].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_())
Офлайн
186
Метод data вызывается очень часто, по этому он должен работать как можно быстрее. Должно быть что-то вроде такого:
bufer = [] class Model(QAbstractTableModel): def __init__(self, parent): QAbstractTableModel.__init__(self) def rowCount(self, parent): return 10000 def columnCount(self, parent): return 10 def data(self, index, role): if index.isValid(): if role == Qt.DisplayRole: return bufer[index.row()][index.column()] def setupModelData(self): self.beginResetModel() db = Table(r"E:\NOMEN") db.open() if row in range(10000): bufer.append((db[row].naimn, )) db.close() self.endResetModel() def headerData(self, section, orientation, role): if orientation == Qt.Vertical and role == Qt.DisplayRole: return "Заголовок №1" class MainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.table = QTableView(self) self.model = Model(self.table) self.table.setModel(self.model) self.model.setupModelData() self.setCentralWidget(self.table) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) ui = MainWindow() ui.show() sys.exit(app.exec_())
Офлайн
0
У меня этот код не работает. В setupModelData не определена row. Ругается. И что такое setupModelData?
Офлайн
186
> И что такое setupModelData
Это метод получающий данные и записывающий их в список bufer. bufer нужен для того что-бы метод data мог забрать уже подготовленные данные.
Код не проверял, по этому могут там могут быть мелкие недочёты.
Отредактировано Rodegast (Март 13, 2016 15:09:56)
Офлайн
0
setupModelData такого метода кажется нет в QAbstractTableModel.
QT 5.5 у меня. Или я не так понял. В общем не пашет эта таблица.
Офлайн
186
> setupModelData такого метода кажется нет в QAbstractTableModel.
Конечно нет. Это я его для удобства создал 
Отредактировано Rodegast (Март 13, 2016 16:05:14)
Офлайн
0
beginResetModel а это что?
Офлайн