我在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()))
在这个点击事件中,我想获得点击按钮行的索引?谢谢Ashish
如果行不能移动,我建议使用一个属性:
例如,对于普通结构,对树结构使用复杂索引:
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()];
...
}
首先,您需要定义一个映射,该映射将存储您的按钮和相应的索引。最好将其作为类的成员变量:
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);
[..]
}