Форум сайта python.su
Помогите пожалуйста начинающему), создаю табличку, добавляю кнопку (через 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_())
Офлайн
Эта ошибка возникает потому, что сишная часть 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
Отредактировано alex925 (Янв. 17, 2015 20:22:44)
Офлайн
Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:
def addButton(self, row, column): self.setCellWidget(row, column + 1, self.button)
Офлайн
alex925Да я так и понял что объект удаляется, интересно как это можно обойти
Эта ошибка возникает потому, что сишная часть Qt удаляет объект содержащий кнопку.Это описано вот тут http://habrahabr.ru/post/210304/Это происходит потому, что если попытаться установить виджет в ячейку, которая уже имеет виджет, то старый виджет удаляется, а новый устанавливается.
alex925да, спасибо за подсказку
Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:
Офлайн
legionНе обязательно, можно сделать атрибут класса, в котором хранить индекс ячейки куда до этого была добавлена кнопка. Тогда можно будет перед тем как добавить новую кнопку в новую ячейку, удалить старую кнопку.
в принципе если внутри функции создать кнопку которая будет добавляться, то она остается, но остается навсегда
Отредактировано alex925 (Янв. 17, 2015 20:43:45)
Офлайн
Возник новый вопрос, свернуть программу в трей, должно убираться в трей при сворачивании, иконка в трее появляется, разворачивается сворачивается (здесь все правильно) но при этом не убирается с панели задач, как убрать с панели задач? что то я пропустил?
через 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_())
Отредактировано legion (Янв. 18, 2015 23:00:41)
Офлайн
legionУ меня вообще не отображается на панели задач:
при этом не убирается с панели задач
legionНапример так:
через QTimer & QDataTime?
def some_function(): print('Прошло ещё 1000мс') timer = QTimer() timer.timeout.connect(some_function) timer.start(1000)
Прикреплённый файлы: Screenshot_2.png (11,3 KБ)
Офлайн
alexbadaloffя сделал сворачивание в трей не при закрытии, а при минимизации именно, может из-за этого беда
Офлайн