Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2015 18:08:13

legion
Зарегистрирован: 2015-01-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Помогите пожалуйста начинающему), создаю табличку, добавляю кнопку (через 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_())

Офлайн

#2 Янв. 17, 2015 19:26:29

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

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

Эта ошибка возникает потому, что сишная часть 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 (Янв. 17, 2015 20:22:44)

Офлайн

#3 Янв. 17, 2015 19:55:35

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

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

Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:

def addButton(self, row, column):
        self.setCellWidget(row, column + 1, self.button)

Офлайн

#4 Янв. 17, 2015 20:18:36

legion
Зарегистрирован: 2015-01-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

alex925
Эта ошибка возникает потому, что сишная часть Qt удаляет объект содержащий кнопку.Это описано вот тут http://habrahabr.ru/post/210304/Это происходит потому, что если попытаться установить виджет в ячейку, которая уже имеет виджет, то старый виджет удаляется, а новый устанавливается.
Да я так и понял что объект удаляется, интересно как это можно обойти
в принципе если внутри функции создать кнопку которая будет добавляться, то она остается, но остается навсегда
alex925
Кстати в функцию, которая обрабатывает сигнал ‘cellClicked(int, int)’ по умолчанию передаётся номер строки и столбца, так что твою функцию addButton, можно сократить, до:
да, спасибо за подсказку
я сначала пытался впихнуть кнопку по-моему через setIndexWidget (если не ошибаюсь, уже запутался) и пытался в них высчитать индекс который возвращал бы +1 столбец (что бы кнопка на следующем столбце добавлялась), но так и не получилось, тогда я через setCellWidget сделал, а лишнее так и осталось))

Офлайн

#5 Янв. 17, 2015 20:40:35

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

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

legion
в принципе если внутри функции создать кнопку которая будет добавляться, то она остается, но остается навсегда
Не обязательно, можно сделать атрибут класса, в котором хранить индекс ячейки куда до этого была добавлена кнопка. Тогда можно будет перед тем как добавить новую кнопку в новую ячейку, удалить старую кнопку.

Мне это вариант, не очень нравится, по этому решил его не предлагать с самого начала. Думаю другие участники форума смогут предложить более элегантное решение.

Отредактировано alex925 (Янв. 17, 2015 20:43:45)

Офлайн

#6 Янв. 18, 2015 22:58:06

legion
Зарегистрирован: 2015-01-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Возник новый вопрос, свернуть программу в трей, должно убираться в трей при сворачивании, иконка в трее появляется, разворачивается сворачивается (здесь все правильно) но при этом не убирается с панели задач, как убрать с панели задач? что то я пропустил?
через 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? хочу сделать что то типа напоминаний по времени

Отредактировано legion (Янв. 18, 2015 23:00:41)

Офлайн

#7 Янв. 20, 2015 14:01:07

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

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

legion
при этом не убирается с панели задач
У меня вообще не отображается на панели задач:


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

legion
через QTimer & QDataTime?
Например так:
def some_function():
    print('Прошло ещё 1000мс')
timer = QTimer()
timer.timeout.connect(some_function)
timer.start(1000)



————————–
Истина где-то рядом

Прикреплённый файлы:
attachment Screenshot_2.png (11,3 KБ)

Офлайн

#8 Янв. 20, 2015 22:44:04

legion
Зарегистрирован: 2015-01-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

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

alexbadaloff
я сделал сворачивание в трей не при закрытии, а при минимизации именно, может из-за этого беда

насчет QTimer, спасибо за помощь так и думал что он так и работает)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version