1

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()))

このクリックイベントで、クリックされたボタンの行のインデックスを取得したいですか? ありがとう、アシッシュ

4

2 に答える 2

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()];
   ...
}
于 2014-10-06T09:05:29.140 に答える
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);
    [..]
}
于 2014-10-06T09:13:30.140 に答える