如何在QTreewidget中获取QPushbutton的click事件的行索引。

时间:2014-10-06 08:48:08

标签: qt qtreeview qtreewidget qtreewidgetitem

我在QTreeWidget的每一行都有QPushbutton。我想获得QPushbutton点击事件的行索引。我正在使用这个:

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

在这个点击事件中,我想获得点击按钮行的索引? 谢谢, 阿希什

2 个答案:

答案 0 :(得分:3)

如果无法移动行,我建议使用属性:

普通结构的示例,使用树结构的复杂索引

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()];
   ...
}

答案 1 :(得分:1)

首先,您需要定义一个地图,该地图将存储您的按钮和相应的索引。最好将此作为您班级的成员变量:

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);
    [..]
}