2014-10-06 46 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); 
    [..] 
} 
相關問題