Форум сайта python.su
Добрый день. Возник следующий вопрос.
Как добавить кнопку в таблицу?
таблица - QtTableWidget, заполняется данными, полученными из базы данных.
В один из столбцов, в зависимости от возвращенного значения True или False, необходимо добавлять кнопку.
Каким образом это лучше сделать?
Спасибо!
Офлайн
Еще один комрад в нашей команде :) Зачем же вас тянет к 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, следовательно ее можно непосредственно передавать как последний аргумент (на случай неких крамольных мыслей)
З.Ы.Ы. Сам не использовал: копи-паст из документации.
Офлайн
Спасибо за ответ.
А что такого плохого в QtSql что к нему не должно тянуть?
И что можно использовать в качестве альтернативы при работе, например, с постгрес? psycopg2?
Офлайн
QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)
Офлайн
helm2004Вы Используете QTableWidget, заполняя его данными на все 100000 строк. То есть сначала запрос вытягивается с сервера, потом вы по нему проходите циклом 100000, заполняя QTableWidget. Это естественно очень долго.
QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)
# -*- 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_())
Офлайн
annndreyОн, так сказать, unpythonic style. Но для небольших вещей вполне себе подходит.
А что такого плохого в QtSql что к нему не должно тянуть?
helm2004Для постгри и лайта работает почти одинакового.
QtSql - насколько я его пробовал очень тормозит.
Офлайн
А может кто-нибудь дать пример, как использовать QTableView вместе с SQLAlchemy? Или ссылку, где описанно, как их подружить.
Ну и заодно, как добавить кнопку в QTableView?
Спасибо.
Офлайн
добавление виджета в tableview обсуждалось тут http://python.su/forum/viewtopic.php?id=5664
там есть пример добавления спинбокса.
Отредактировано (Авг. 25, 2010 15:31:58)
Офлайн
aaleksanderА в чем конкретно сложность?
А может кто-нибудь дать пример, как использовать QTableView вместе с SQLAlchemy? Или ссылку, где описанно, как их подружить
Офлайн