Как получить индекс строк при нажатии кнопки QPushbutton в QTreewidget.

У меня есть QPushbutton в каждой строке QTreeWidget. Я хочу получить индекс строк в событии щелчка QPushbutton. Я использую это:

QPushButton btn=new QPushButton();
QTreeWidgetItem *Items=new QTreeWidgetItem(ui->treeWidget);
ui->treeWidget->setItemWidget(Items,0,btn);
connect(btn,SIGNAL(clicked()),this,SLOT(OnPreview()))

В этом событии щелчка я хочу получить индекс строки нажатой кнопки? Спасибо, Ашиш


person Ashish    schedule 06.10.2014    source источник
comment
Вам нужно либо вычислить индекс в слоте OnPreview(), либо сохранить сопоставление между кнопкой и индексом, которому она назначена.   -  person vahancho    schedule 06.10.2014
comment
спасибо, ваханчо, я знаю, что должен сделать это в OnPreview(). но как это главное..? Есть предположения..?   -  person Ashish    schedule 06.10.2014


Ответы (2)


Если строки не могут быть перемещены, я бы предложил использовать свойство:

Пример для простой структуры, используйте сложный индекс для древовидной структуры:

QPushButton btn=new QPushButton();
btn->setProperty("row", ui->treeWidget->topLevelItemCount());

void OnPreview()
{
  int row = sender()->property("row").toInt();
  QTreeWidgetItem* item = ui->treeWidget->topLevelItem(row);
}

В противном случае, если количество строк не слишком велико, вы можете выполнить цикл по элементам, чтобы узнать, какой из них содержит кнопку:

Пример для простой структуры, используйте сложный индекс для древовидной структуры:

void OnPreview()
{
   for(int i = 0 ; i < ui->treeWidget->topLevelItemCount() ; i++)
   {
      QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
      if (ui->treeWidget->itemWidget(item, 0) == sender())
      {
          ...
      }
   }
}

Если у вас большое количество строк и их можно перемещать, создайте хеш-таблицу для сопоставления кнопок и элементов:

QHash<QObject*, QTreeWidgetItem*> hash;

QPushButton* btn=new QPushButton();
QTreeWidgetItem *Items=new QTreeWidgetItem(ui->treeWidget);
hash[btn] = Items;

void OnPreview()
{
   QTreeWidgetItem* item = hash[sender()];
   ...
}
person Ezee    schedule 06.10.2014

Сначала вам нужно определить карту, которая будет хранить ваши кнопки и соответствующие индексы. Делайте это предпочтительно как переменную-член вашего класса:

QMap<QObject, QModelIndex> map;

Затем в функции, где вы создаете кнопки:

{
     [..]
     QPushButton *btn = new QPushButton();
     QTreeWidgetItem *Items = new QTreeWidgetItem(ui->treeWidget);
     ui->treeWidget->setItemWidget(Items, 0, btn);
     connect(btn, SIGNAL(clicked()), this, SLOT(OnPreview()));

     QModelIndex index = ui->treeWidget->indexFromItem(Items);
     map.insert(btn, index);
     [..]
}

И, наконец, ваш слот:

void OnPreview()
{
    QObject *btn = sender();
    QModelIndex index = map.value(btn);
    [..]
}
person vahancho    schedule 06.10.2014