web-dev-qa-db-ja.com

QTreeViewの特定のアイテムに右クリックメニューを追加する

Qt Creatorを使用して、C++でQtデスクトップアプリケーションを作成しています。

メインウィンドウでtreeViewと互換性のあるモデルを宣言しました。

ここで、ツリーアイテムの右クリックメニューが必要です。すべてのアイテムではなく、それらの一部、たとえば、インデックスが偶数のツリー要素の場合。

次のコードで簡単なコンテキストメニューを追加してみました。

。hファイル内:

QStandardItemModel* model;
QMenu* contextMenu;
QAction* uninstallAction;
private slots:
    void uninstallAppletClickedSlot();

および.cppファイル:

コンストラクター内:

ui->treeView->setModel(model);
contextMenu = new QMenu(ui->treeView);
ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu);
uninstallAction = new QAction("Uninstall TA",contextMenu);
ui->treeView->addAction(uninstallAction);
connect(uninstallAction, SIGNAL(triggered()), this, SLOT(uninstallAppletClickedSlot()));

およびスロット:

void MainWindow::uninstallAppletClickedSlot()
{

}

このコードは、必要なアクションを含むコンテキストメニューを提供しますが、偶数インデックスを持つQStandardItemsに対してのみこのアクションを追加する方法はありますか?

ところで、私は次の方法でtreeViewにアイテムを追加しています:

void MainWindow::AddItem(QString name)
{
QStandardItem *parentItem = model->invisibleRootItem();
QStandardItem *app = new QStandardItem(name);
parentItem->appendRow(app);
}

私は多くのグーグルを検索しましたが、何も見つかりませんでした:(

前もって感謝します!

28
user1835297

これは次の方法で行います。

コンテキストメニューを構成する

ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onCustomContextMenu(const QPoint &)));

コンテキストメニューの処理を実装する

void MainWindow::onCustomContextMenu(const QPoint &point)
{
    QModelIndex index = ui->treeView->indexAt(point);
    if (index.isValid() && index.row() % 2 == 0) {
        contextMenu->exec(ui->treeView->viewport()->mapToGlobal(point));
    }    
}
47
vahancho