2014-10-06 37 views
1

我在QTreeWidget的每一行都有QPushbutton。我想在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())) 

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

+0

你需要要么计算'OnPreview()'槽中的索引,或者保持按钮与其分配的索引之间的映射。 – vahancho 2014-10-06 08:51:55

+0

thnx vahancho,我知道我必须在OnPreview()中做到这一点。但这是怎么回事呢?任何猜测..? – Ashish 2014-10-06 08:57:05

回答

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

首先你需要定义一个地图,它将存储你的按钮和相应的索引。做到这一点最好为您的类的成员变量:

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); 
    [..] 
} 
相关问题