Найти - Пользователи
Полная версия: Технология работы с базой данных
Начало » Python для новичков » Технология работы с базой данных
1 2 3 4 5 6
MaratD
Вообще где можно почитать про все это на русском?
Rodegast
> beginResetModel а это что?

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

> Вообще где можно почитать про все это на русском?
Марк Саммерфилд - Qt Профессиональное программирование.
vic57
для новичка 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
<для новичка QTableWidget проще>

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

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

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

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_())
MaratD
если не трудно на 4 странице гляньте, я его выкладывал )
ПОЖАЛУЙСТА
Rodegast
> код тот же, ничего нового не придумал

Ну тогда попробую объяснить. Вот в чём твоя проблема:
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
я думал один раз загрузится и база закроется.
Тогда в чем преимущество модели.
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