Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2010 21:06:23

annndrey
От:
Зарегистрирован: 2009-06-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

Добрый день. Возник следующий вопрос.

Как добавить кнопку в таблицу?
таблица - QtTableWidget, заполняется данными, полученными из базы данных.
В один из столбцов, в зависимости от возвращенного значения True или False, необходимо добавлять кнопку.
Каким образом это лучше сделать?

Спасибо!



Офлайн

#2 Март 18, 2010 17:02:15

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

Еще один комрад в нашей команде :) Зачем же вас тянет к QtSql? Ну это ладно, а по сабжу:

QTableWidget.setCellWidget (self, int, int, QWidget)

The QWidget argument has it's ownership transferred to Qt.
Sets the given widget to be displayed in the cell in the given row and column, passing the ownership of the widget to the table.
If cell widget A is replaced with cell widget B, cell widget A will be deleted. For example, in the code snippet below, the QLineEdit object will be deleted.
setCellWidget(index, QLineEdit());

setCellWidget(index, QTextEdit());

Что в переводе на русский означает: юзай setCellWidget (int, int, QWidget)
З.Ы. кнопка - наследник QWidget, следовательно ее можно непосредственно передавать как последний аргумент (на случай неких крамольных мыслей)
З.Ы.Ы. Сам не использовал: копи-паст из документации.



Офлайн

#3 Март 19, 2010 22:48:48

annndrey
От:
Зарегистрирован: 2009-06-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

Спасибо за ответ.

А что такого плохого в QtSql что к нему не должно тянуть?

И что можно использовать в качестве альтернативы при работе, например, с постгрес? psycopg2?



Офлайн

#4 Март 19, 2010 23:12:38

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)

Офлайн

#5 Март 20, 2010 17:24:15

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

helm2004
QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)
Вы Используете QTableWidget, заполняя его данными на все 100000 строк. То есть сначала запрос вытягивается с сервера, потом вы по нему проходите циклом 100000, заполняя QTableWidget. Это естественно очень долго.

при использовании QTableView и модели заполнения 100000 строк для виджета не происходит. Заполняется только видимая часть. Разберитесь с MVC.

вот простейший пример для мускуля, настройтесь на свою БД, попробуйте
у меня 4500000 строк отображаются через 35 сек (для первого запуска, а потом - через 8)
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import *
from PyQt4.QtSql import *
from PyQt4.QtCore import *
import time

class zzCursorModel(QAbstractTableModel):
def __init__(self, selectSql, headerString=""):
QAbstractTableModel.__init__(self)
self.selectSql=selectSql
self.columns=selectSql.split("select")[1].split("from")[0].strip().split(",")
self.columncount=len(self.columns)
self.headers=[]
if headerString<>"": self.headers=headerString.split("|")
while len(self.columns)>len(self.headers):
self.headers.append(self.columns[len(self.headers)])
self.sqlCursor=QSqlQuery()
self.sqlCursor.exec_(selectSql)
self.sqlCursor.last()
self.rowcount=self.sqlCursor.at()+1
print self.rowcount
def rowCount(self,parent): return self.rowcount
def columnCount(self,parent): return self.columncount
def data(self, index, role=Qt.DisplayRole):
if not index.isValid(): return QVariant()
if role == Qt.DisplayRole:
self.sqlCursor.seek(index.row())
return QVariant(self.sqlCursor.record().value(index.column()).toString())
else:
return QVariant()
def headerData(self, col, orientation, role=Qt.DisplayRole):
## тут задаются заголовки
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(QString(self.headers[col]))
if orientation == Qt.Vertical and role == Qt.DisplayRole:
return QVariant("%s" % col)
elif role == Qt.TextAlignmentRole:
return QVariant(Qt.AlignCenter)
return QVariant()

if __name__ == "__main__":
app = QApplication(sys.argv)

db=QSqlDatabase.addDatabase("QMYSQL")
db.setDatabaseName("x2_mysql")
db.setHostName("localhost")
db.setPassword("")
db.setPort(3306)
db.setUserName("one")
db.open()
d=time.clock()
model = zzCursorModel("select uid from otgr", "U I D")

view = QTableView()
view.setModel(model)
view.show()
print time.clock()-d

sys.exit(app.exec_())



Офлайн

#6 Март 21, 2010 01:21:17

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Добавление кнопки в таблицу

annndrey
А что такого плохого в QtSql что к нему не должно тянуть?
Он, так сказать, unpythonic style. Но для небольших вещей вполне себе подходит.
А вообще да – psycopg2. Но обычно куда приятнее использовать SqlAlchemy.

helm2004
QtSql - насколько я его пробовал очень тормозит.
Для постгри и лайта работает почти одинакового.



Офлайн

#7 Май 4, 2010 15:55:31

aaleksander
От:
Зарегистрирован: 2009-12-22
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

А может кто-нибудь дать пример, как использовать QTableView вместе с SQLAlchemy? Или ссылку, где описанно, как их подружить.
Ну и заодно, как добавить кнопку в QTableView?

Спасибо.



Офлайн

#8 Авг. 25, 2010 14:45:45

annndrey
От:
Зарегистрирован: 2009-06-11
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

добавление виджета в tableview обсуждалось тут http://python.su/forum/viewtopic.php?id=5664

там есть пример добавления спинбокса.



Отредактировано (Авг. 25, 2010 15:31:58)

Офлайн

#9 Авг. 26, 2010 07:00:17

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление кнопки в таблицу

aaleksander
А может кто-нибудь дать пример, как использовать QTableView вместе с SQLAlchemy? Или ссылку, где описанно, как их подружить
А в чем конкретно сложность?
Я делал так:
В инициализации модели запускал поток, который через объекты алхимии тянул нужные данные, потом генерил сигнал для модели, что данные готовы. Модель ловила сигнал, подхватывала данные и отображала.
Или я вопроса не понял? :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version