Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2016 16:33:54

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

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

Вообще где можно почитать про все это на русском?

Офлайн

#2 Март 13, 2016 16:40:09

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

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

> beginResetModel а это что?

beginResetModel - начало перезаполнения данных
endResetModel - конец перезаполнения данных
Эти методы нужны для того что-бы сообщить представлению что данные поменялись.

> Вообще где можно почитать про все это на русском?
Марк Саммерфилд - Qt Профессиональное программирование.



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

Офлайн

#3 Март 14, 2016 13:45:22

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

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

для новичка 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 там доступно описано

Отредактировано vic57 (Март 14, 2016 15:54:34)

Офлайн

#4 Март 15, 2016 08:40:02

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

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

<для новичка QTableWidget проще>

да проще, но я читал что он тормозит при большой таблице и много памяти требует. А у меня большая таблица. И QTableView все равно тормозит. Видимо я что-то не дописал в своем коде. Или неправильно написал.
Прохоренок читал, нет примеров, просто теория.

Офлайн

#5 Март 15, 2016 09:38:45

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

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

vic57 Ты бы сначала ООП выучал и только потом что-то писать пытался.

> Прохоренок Н.А. погугли. PyQt там доступно описано
Это отвратительная книга. Ничего хорошего кроме тупого перевода документации в ней нет.

> Видимо я что-то не дописал в своем коде. Или неправильно написал.
Вкладывай код ещё раз. Посмотрю что там может быть не так.



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

Офлайн

#6 Март 15, 2016 12:57:32

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

Офлайн

#7 Март 15, 2016 12:58:28

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(rE:\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_())

Офлайн

#8 Март 15, 2016 13:01:33

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

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

если не трудно на 4 странице гляньте, я его выкладывал )
ПОЖАЛУЙСТА

Офлайн

#9 Март 15, 2016 13:52:29

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

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

> код тот же, ничего нового не придумал

Ну тогда попробую объяснить. Вот в чём твоя проблема:

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 вызывается несколько раз для каждого индекса (ячейки) при отрисовки виджита (отрисовываются только видимые ячейки). По этому он должен работать как можно быстрее, а у тебя там идёт работа с БД, которая не может быть быстрой и как следствие всё будет тормозить, особенно при прокрутки. По этому перед заполнением виджита тебе надо считать данные в буфер.



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

Отредактировано Rodegast (Март 15, 2016 19:36:41)

Офлайн

#10 Март 15, 2016 19:29:53

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

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

я думал один раз загрузится и база закроется.
Тогда в чем преимущество модели.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version