Найти - Пользователи
Полная версия: Добавление кнопки в таблицу
Начало » GUI » Добавление кнопки в таблицу
1
annndrey
Добрый день. Возник следующий вопрос.

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

Спасибо!
dartNNN
Еще один комрад в нашей команде :) Зачем же вас тянет к 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, следовательно ее можно непосредственно передавать как последний аргумент (на случай неких крамольных мыслей)
З.Ы.Ы. Сам не использовал: копи-паст из документации.
annndrey
Спасибо за ответ.

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

И что можно использовать в качестве альтернативы при работе, например, с постгрес? psycopg2?
helm2004
QtSql - насколько я его пробовал очень тормозит. Пример:
Мускуль вместе с пайтоном, запрос в 100000 строк в таблицу с 30 текстовыми полями на целероне 1.1 и винде и 2 гигами оператвы - 34 сек, а QtSql - 7 минут :)
villager
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_())
ZZZ
annndrey
А что такого плохого в QtSql что к нему не должно тянуть?
Он, так сказать, unpythonic style. Но для небольших вещей вполне себе подходит.
А вообще да – psycopg2. Но обычно куда приятнее использовать SqlAlchemy.

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

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

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