Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2016 22:57:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Технология работы с базой данных

Думал сам разберусь, но видно не судьба. Объясните пожалуйста зачем так сложно МОДЕЛЬ-ПРЕДСТАВЛЕНИЕ? Нельзя просто МОДЕЛЬ и работать с ней? Никак не пойму эту методологию. Для чего нужна модель и для чего нужно представление? И как сохранять изменения в базе
ну база данных по простому это двумерная таблица, или набор таблиц. может быть большой.
1.модель - данные полученные от БД по запросу.
2.представление - таблица, дерево, список - визуализация для удобства работы
3.контроллер - управление данными - фильтрация, изменение, сохранение в модели, запрос к БД на сохранение изменений.
тут неплохо написано

Офлайн

#2 Март 12, 2016 20:28:24

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Технология работы с базой данных

Здравствуйте, уважаемые разработчики.
Модель (QAbstractTableModel) у меня 10 столбцов и 10000 строк. Данные загрузил с dbf файла во второй столбец. То есть получается даже не таблица , а один столбец на 10000 строк. Представление у меня таблица QTableView.
Делегатов нет. Никаких сигналов и слотов. Пытаюсь просматривать эту таблицу, комп зависает и тормозит. Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon? Как тогда работать с полной таблицей (20000 строк и 10 столбцов)?
Спасибо.

Офлайн

#3 Март 12, 2016 20:45:09

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Технология работы с базой данных

> Смотрю в диспетчере процессор грузится на 70-90 процентов. Это нормально для Pynhon?

Нет. Код в студию!



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Март 13, 2016 13:42:33

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Технология работы с базой данных

'''
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_())

Офлайн

#5 Март 13, 2016 14:12:24

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Технология работы с базой данных

Метод 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_())



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Март 13, 2016 14:54:14

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Технология работы с базой данных

У меня этот код не работает. В setupModelData не определена row. Ругается. И что такое setupModelData?

Офлайн

#7 Март 13, 2016 15:07:47

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Технология работы с базой данных

> И что такое setupModelData
Это метод получающий данные и записывающий их в список bufer. bufer нужен для того что-бы метод data мог забрать уже подготовленные данные.
Код не проверял, по этому могут там могут быть мелкие недочёты.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 13, 2016 15:09:56)

Офлайн

#8 Март 13, 2016 15:53:11

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Технология работы с базой данных

setupModelData такого метода кажется нет в QAbstractTableModel.
QT 5.5 у меня. Или я не так понял. В общем не пашет эта таблица.

Офлайн

#9 Март 13, 2016 16:04:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Технология работы с базой данных

> setupModelData такого метода кажется нет в QAbstractTableModel.
Конечно нет. Это я его для удобства создал



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 13, 2016 16:05:14)

Офлайн

#10 Март 13, 2016 16:32:50

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Технология работы с базой данных

beginResetModel а это что?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version