【问题标题】:Adding a right-click menu for specific items in QTreeView为 QTreeView 中的特定项目添加右键菜单
【发布时间】:2014-03-05 12:56:08
【问题描述】:

我正在使用 Qt Creator 用 C++ 编写 Qt 桌面应用程序。

我在主窗口中声明了一个树视图和一个兼容模型。

现在,我想要一个树项目的右键菜单。不是针对所有项目,而是针对其中的一部分,例如:具有偶数索引的树元素。

我尝试使用以下代码添加一个简单的上下文菜单:

在 .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 添加此操作吗??

顺便说一句,我通过以下方式将项目添加到树视图:

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

我用谷歌搜索了很多,但一无所获:(

提前致谢!

【问题讨论】:

    标签: qt right-click qtreeview qstandarditem


    【解决方案1】:

    我会这样做:

    配置上下文菜单

    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));
        }    
    }
    

    【讨论】:

    • 谢谢,@vahancho,我按照您的指示进行操作,但结果是:一旦我按下具有偶数索引的一行 - 我可以看到表格中出现一个小点,一旦我按下具有奇数索引的行 - 什么都没有出现。这很好,但菜单根本没有出现!即 exec() 函数没有执行想要的操作。你还有什么想法吗?非常感谢!
    • @user1835297,实际上你必须事先构建你的菜单。我的答案中没有包含该代码。你只需要:contextMenu->addAction("Uninstall TA", this, SLOT(uninstallAppletClickedSlot()); 左右。
    • 使用 ui->treeview->viewport()->mapToGlobal(point) 代替,如果您遇到奇怪的菜单偏移。
    • 那是因为项目视图是 QAbstractScrollareas。因此,“此规则的例外是 QAbstractScrollArea 及其将上下文菜单事件映射到 viewport() 坐标的子类。”来自文档适用。
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多