Russian Qt Forum

Qt => Общие вопросы => Тема начата: Garik от Апрель 11, 2011, 15:26



Название: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: Garik от Апрель 11, 2011, 15:26
Всем Привет!!!! Сижу вот разбираюсь с функцией TreeWidget, нужно сделать следущее: - создается например произвольное количество QTreeWidgetItem, далее нужно наступить мышкой или клавиатурой на какой либо елемент и при этом должен сработать сигнал itemActivated(QTreeWidgetItem*,int).
написал пробный код, сигнал срабатывает но при переходе в слот не передается номер елемента на которм было произведено действие!!! понимаю что задача тривиальна, но я новичек и нуждаюсь в помощи..
Выкладываю сразу код:
Код:
void ImageViewer::TreeWidget()
{

    dockWidget = new QDockWidget(tr("Tree"), this);
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea, dockWidget);


    QTreeWidget *treeWidget = new QTreeWidget(dockWidget);
    treeWidget->setColumnCount(2);
    QStringList headers;
    headers << ("Subject") << ("Default");
    treeWidget->setHeaderLabels(headers);

   QTreeWidgetItem *Main = new QTreeWidgetItem(treeWidget, QStringList("Main1"));
    for( int m = 0; m <10; m++)
    {
       QTreeWidgetItem *pChild = new QTreeWidgetItem( Main );
       QString sz00 = QObject::tr( "first defects: %1 ").arg( m);
       pChild->setText(0, sz00);
       POP.push_back(pChild);
   }


   QTreeWidgetItem *Main2 = new QTreeWidgetItem(treeWidget, QStringList("Main2"));
    for( int n = 0; n <10; n++)
    {
      QTreeWidgetItem *pChild1 = new QTreeWidgetItem( Main2 );
       QString sz00 = QObject::tr( "second defects: %1 ").arg( n );
       pChild1->setText(0, sz00);
       POP.push_back(pChild1);
   }

    qDebug() << "Iterating from top level";
    for (QTreeWidgetItemIterator it(treeWidget); *it; ++it )
    qDebug() << "Item text" << (*it)->text(0);

 dockWidget->setWidget(treeWidget);

connect(treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(setActivated(QTreeWidgetItem*, int)));
}


void ImageViewer::setActivated(QTreeWidgetItem *item, int column)
{

    qDebug() << "Work2";
      qDebug() << "Number:" << column;
}

постоянно передается "0"????

Заранее Спасибо!!!


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: mutineer от Апрель 11, 2011, 15:29
Там передается не номер строки (элемента), а номер столбца, на котором кликнули. Видимо столбец у тебя один, поэтому 0 всегда и передается. Внимательнее с документацией же, ну...


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: Garik от Апрель 11, 2011, 15:45
Там передается не номер строки (элемента), а номер столбца, на котором кликнули. Видимо столбец у тебя один, поэтому 0 всегда и передается. Внимательнее с документацией же, ну...

сорри понял!!!! А как сделать  что-бы передовался именно номер елемента на котором произвилось действме,,,, у меня именно в этом загвостка??? 


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: mutineer от Апрель 11, 2011, 15:49
Тебе нужен именно номер? QTreeWidgetItem* - это указатель на кликнутый элемент, в нем все данные этого элемента есть. Но если нужен именно номер, то думаю можно получить через
Код:
item->parent->indexOfChild(item)
Хотя это как-то костыльно


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: Garik от Апрель 11, 2011, 16:04
Именно номер!!! что-бы его в дальнейшем присвоить обычно переменной типа int i;!!!!!


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: mutineer от Апрель 11, 2011, 16:05
Попробуй тот кусок, что я написал. Вроде должен возвращать номер


Название: Re: Как корекктно работать с сигналом - itemActivated(QTreeWidgetItem*,int)???
Отправлено: Garik от Апрель 11, 2011, 16:18
Благодарю!!!! получилось. Я тут еще попробовал другим методом через итератор(из примеров выпыл): вроде тоже показывает номер, но вот как присвоить простой переменно еще не понял.

Код:
void ImageViewer::setActivated(QTreeWidgetItem *item, int column)
{
int i;


i=item->parent()->indexOfChild(item);

      for (QTreeWidgetItemIterator it(item, QTreeWidgetItemIterator::Selected); *it; ++it )  //обход выделенных item
      qDebug() << "Select Item " << (*it)->text(0);


qDebug() << "Number:" << i;

}