Qt 4.1.2
Есть дерево в узлах установлено чекбокс, так вот не получается выловить сигнал измения состояния этого чек бокса... (когда пользователь щёлкает по чекбоксу)
connect(this,SIGNAL(itemClicked( QTreeWidgetItem * item, int column )),this,SLOT(OnChangedItem( QTreeWidgetItem * item, int column ) ));
сonnect(this,SIGNAL(itemChanged( QTreeWidgetItem * item, int column ) ),this,SLOT(OnChangedItem( QTreeWidgetItem * item, int column ) ));
разумеется слот OnChangedItem( QTreeWidgetItem * item, int column ) создан.
но не отрабатывает а где грабли не вижу...
А как ты выставляешь чекбокс? Я просто не совсе понял, что за чекбокс...
чето я про чек бокс тоже не въехал, если юзер именно чек бокс кликает дак и сигнал чекбокса ловить надо
void stateChanged ( int state )
void clicked ( bool checked = false )
Есть класс унаследованный от QTreeWidget
внутри класса
создал узел
QTreeWidgetItem* pItem = new QTreeWidgetItem(this);
вставил чекбокс
pItem->setCheckState(0,Qt::Checked);
У меня все отрабатывает, я сделал вот так:
class CTest: public QObject
{
Q_OBJECT
public:
CTest(QWidget *parent = 0, Qt::WFlags flags = 0){}
~CTest(){}
public slots:
void OnCheckState( QTreeWidgetItem *item, int column);
};
void CTest::OnCheckState( QTreeWidgetItem *item, int column)
{
QMessageBox::information( 0, "info", QObject::tr( "%1- column %2").arg( item->isExpanded()).arg( column));
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeWidget *pTreeWidget = new QTreeWidget( 0);
pTreeWidget->setColumnCount(2);
QStringList headers;
headers << QObject::tr("Subject") << QObject::tr("Default");
pTreeWidget->setHeaderLabels( headers);
QTreeWidgetItem *pRoot = new QTreeWidgetItem( pTreeWidget);
pRoot->setText( 0, QObject::tr("Root"));
for( int n = 0; n < 100; n++)
{
QTreeWidgetItem *pChild = new QTreeWidgetItem( pRoot);
pChild->setFlags( pChild->flags() | Qt::ItemIsEditable);
QString sz0 = QObject::tr( "Item %1").arg( n);
QString sz1 = QObject::tr( "Sub item %1").arg( n);
pChild->setText(0, sz0);
pChild->setText(1, sz1);
pChild->setCheckState(0,Qt::Checked);
}
pTreeWidget->expandItem( pRoot);
//pTreeWidget->collapseItem( pRoot);
CTest test;
QObject::connect( pTreeWidget, SIGNAL( itemChanged( QTreeWidgetItem *, int)), &test, SLOT( OnCheckState( QTreeWidgetItem *, int)));
pTreeWidget->show();
return a.exec();
}
Я по пробывал твой пример скомпилить, линкер ругается:
build/main.o(.text+0x1c):main.cpp: undefined reference to `vtable for CTest'
build/main.o(.text+0x4c):main.cpp: undefined reference to `vtable for CTest'
build/main.o(.text+0xb33):main.cpp: undefined reference to `vtable for CTest'
build/main.o(.text+0xc4c):main.cpp: undefined reference to `vtable for CTest'
collect2: ld returned 1 exit status
#include <QtGui>
Класс CTest нужно перенести в .h файл.
хм, а вчем принципиальная разница?
в moc'е.
ХМ, НЮАНЕЦ однако, это видимо во всех случаях где макрос Q_OBJECT,
т.к. без него я делал все в одном файле.
понял почему у меня не получалось.
надо было так
itemChanged ( QTreeWidgetItem *,int )
а у меня было так
itemChanged ( QTreeWidgetItem * item, int column)
Возник другой вопрос.
Как сделать чтобы событие отрабатывало только по действию пользователя но не работало при программном изменение значения ?
ну можно конечно делать дисконект слота перед прграмным изменением а после снова делать конектЮ но может есть что более "красивое"...
не все сигналы посылаются при програмном изменении состояния, плюс некоторые функции попадаются перегруженые, в которых можно флажек выставить, "не сигналить". надо справку почитать вдруг для твоего случая такая комбинация сигнала и функции setFoo() попадется.
Зачем же дисконнект/коннект?
Есть же QObject::blockSignals
кстати чего-то сразу ступил...
blockSignal можно же выборочно использовать к любому объекту в том числе к любому объкту диалога а не кдиалогу целиком.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)