Найти - Пользователи
Полная версия: QTableWidget и кнопка в таблице
Начало » GUI » QTableWidget и кнопка в таблице
1
legion
Помогите пожалуйста начинающему), создаю табличку, добавляю кнопку (через setCellWidget) в таблицу, при выборе пользователем ячейки в первом столбце кнопка добавляется во второй, ну вообщем не важно в какой, добавляется она отлично (удаляется тоже правильно), но только один раз, если второй раз выбрать ту же ячейку, кнопка не добавиться, если клацать дальше то вылазит ошибка
wrapped C/C++ object of type QPushButton has been deleted
из документации понятно что объект удаляется если вставляется следующий, но как заставить по кругу работать?

код
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class Main(QtGui.QTableWidget):           
        def __init__(self):
                QtGui.QTableWidget.__init__(self)
                self.setColumnCount(2)
                self.setRowCount(5)
                self.resize(500,300)
                
                self.button=QtGui.QPushButton('...', self)
                self.button.hide()
              
                self.connect(self, QtCore.SIGNAL('cellClicked(int, int)'), self.addButton)
               
        def addButton(self): 
                modelIndex=self.currentIndex()
                col=modelIndex.column()
                row=modelIndex.row()
                self.setCellWidget(row,col+1, self.button) 
                
app=QtGui.QApplication(sys.argv)
main=Main()
main.show()          
sys.exit(app.exec_())
alex925
Эта ошибка возникает потому, что сишная часть Qt удаляет объект содержащий кнопку.
Это описано вот тут http://habrahabr.ru/post/210304/

Это происходит потому, что если попытаться установить виджет в ячейку, которая уже имеет виджет, то старый виджет удаляется, а новый устанавливается.
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.
http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html#setCellWidget
Вот в твоём случае и получается, что Qt сначала удаляет из ячейки установленную туда ранее кнопку, а затем пытается установить только что удалённую кнопку.
alex925
Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:
def addButton(self, row, column):
        self.setCellWidget(row, column + 1, self.button)
legion
alex925
Эта ошибка возникает потому, что сишная часть Qt удаляет объект содержащий кнопку.Это описано вот тут http://habrahabr.ru/post/210304/Это происходит потому, что если попытаться установить виджет в ячейку, которая уже имеет виджет, то старый виджет удаляется, а новый устанавливается.
Да я так и понял что объект удаляется, интересно как это можно обойти
в принципе если внутри функции создать кнопку которая будет добавляться, то она остается, но остается навсегда
alex925
Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:
да, спасибо за подсказку
я сначала пытался впихнуть кнопку по-моему через setIndexWidget (если не ошибаюсь, уже запутался) и пытался в них высчитать индекс который возвращал бы +1 столбец (что бы кнопка на следующем столбце добавлялась), но так и не получилось, тогда я через setCellWidget сделал, а лишнее так и осталось))
alex925
legion
в принципе если внутри функции создать кнопку которая будет добавляться, то она остается, но остается навсегда
Не обязательно, можно сделать атрибут класса, в котором хранить индекс ячейки куда до этого была добавлена кнопка. Тогда можно будет перед тем как добавить новую кнопку в новую ячейку, удалить старую кнопку.

Мне это вариант, не очень нравится, по этому решил его не предлагать с самого начала. Думаю другие участники форума смогут предложить более элегантное решение.
legion
Возник новый вопрос, свернуть программу в трей, должно убираться в трей при сворачивании, иконка в трее появляется, разворачивается сворачивается (здесь все правильно) но при этом не убирается с панели задач, как убрать с панели задач? что то я пропустил?
через closeEvent пока не хочу убирать.

код (неполный)
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class Main(QtGui.QMainWindow):           
        def __init__(self):
                QtGui.QMainWindow.__init__(self)
                self.resize(500,300)            
                self.setWindowTitle('window')
                self.setCentralWidget(self.getTable)
                self.tray=QtGui.QSystemTrayIcon(self)
                self.connect(self.tray, QtCore.SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), self.onTray)
                ...........
        def hideEvent(self, event):        
                #icon=('file.png')
                #self.tray.setIcon(icon)
                        
                self.hide()
                self.tray.setToolTip('notes')
                self.tray.show()
                #self.setVisible(False)
        def onTray(self, reason):
                
                self.show()
                self.showNormal()
                self.tray.hide()
app=QtGui.QApplication(sys.argv)
main=Main()
main.show()          
sys.exit(app.exec_())

и еще такой вопрос, как обрабатываются события по времени? через QTimer & QDataTime? хочу сделать что то типа напоминаний по времени
alexbadaloff
legion
при этом не убирается с панели задач
У меня вообще не отображается на панели задач:


Вроде бы с панели задач убирается обычным hide у QMainWindow.

legion
через QTimer & QDataTime?
Например так:
def some_function():
    print('Прошло ещё 1000мс')
timer = QTimer()
timer.timeout.connect(some_function)
timer.start(1000)
legion
alexbadaloff
я сделал сворачивание в трей не при закрытии, а при минимизации именно, может из-за этого беда

насчет QTimer, спасибо за помощь так и думал что он так и работает)
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