Найти - Пользователи
Полная версия: Технология работы с базой данных
Начало » Python для новичков » Технология работы с базой данных
1 2 3 4 5 6
vic57
Думал сам разберусь, но видно не судьба. Объясните пожалуйста зачем так сложно МОДЕЛЬ-ПРЕДСТАВЛЕНИЕ? Нельзя просто МОДЕЛЬ и работать с ней? Никак не пойму эту методологию. Для чего нужна модель и для чего нужно представление? И как сохранять изменения в базе
ну база данных по простому это двумерная таблица, или набор таблиц. может быть большой.
1.модель - данные полученные от БД по запросу.
2.представление - таблица, дерево, список - визуализация для удобства работы
3.контроллер - управление данными - фильтрация, изменение, сохранение в модели, запрос к БД на сохранение изменений.
тут неплохо написано
MaratD
Здравствуйте, уважаемые разработчики.
Модель (QAbstractTableModel) у меня 10 столбцов и 10000 строк. Данные загрузил с dbf файла во второй столбец. То есть получается даже не таблица , а один столбец на 10000 строк. Представление у меня таблица QTableView.
Делегатов нет. Никаких сигналов и слотов. Пытаюсь просматривать эту таблицу, комп зависает и тормозит. Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon? Как тогда работать с полной таблицей (20000 строк и 10 столбцов)?
Спасибо.
Rodegast
> Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon?

Нет. Код в студию!
MaratD
'''
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_())
Rodegast
Метод 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_())
MaratD
У меня этот код не работает. В setupModelData не определена row. Ругается. И что такое setupModelData?
Rodegast
> И что такое setupModelData
Это метод получающий данные и записывающий их в список bufer. bufer нужен для того что-бы метод data мог забрать уже подготовленные данные.
Код не проверял, по этому могут там могут быть мелкие недочёты.
MaratD
setupModelData такого метода кажется нет в QAbstractTableModel.
QT 5.5 у меня. Или я не так понял. В общем не пашет эта таблица.
Rodegast
> setupModelData такого метода кажется нет в QAbstractTableModel.
Конечно нет. Это я его для удобства создал
MaratD
beginResetModel а это что?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB