QTreeWidget右键菜单(QTreeWidget right click menu)

2019-08-06 04:34发布

我环顾四周,似乎这个问题不仅是树部件也为其他部件存在。 但对我来说,我发现了一个解决方案,虽然不完整的一个。 我加入行动,我的树部件,这样,当你右键点击它,会出现这些动作的弹出窗口。 然而,当我将项目添加到我的树部件和我右键单击它们,出现相同的弹出窗口。 我希望做的是,当你右击树部件,一个树部件弹出菜单中出现,当你右键点击物品,出现另一个相应的弹出式菜单。 有谁知道如何做到这一点?

Answer 1:

首先,你应该设置上下文菜单的政策 ,以CustomContextMenu

treeView->setContextMenuPolicy(Qt::CustomContextMenu);

然后,你可以连接到QWidget::customContextMenuRequested(const QPoint&)信号,并显示您的上下文菜单。



Answer 2:

首先,CONFIG QTreeWidget到响应(发射信号)点击鼠标右键:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

其次,你的插槽“主窗口:: prepareMenu”连接的信号:

connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu);

三,创建在插槽上下文菜单:

void MainWindow::prepareMenu( const QPoint & pos )
{
QTreeWidget *tree = treeWid;

QTreeWidgetItem *nd = tree->itemAt( pos );

qDebug()<<pos<<nd->text(0);


QAction *newAct = new QAction(QIcon(":/Resource/warning32.ico"), tr("&New"), this);
newAct->setStatusTip(tr("new sth"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newDev()));


QMenu menu(this);
menu.addAction(newAct);

QPoint pt(pos);
menu.exec( tree->mapToGlobal(pos) );
}


Answer 3:

看看重载化QAbstractItemModel,并提供自己的OnContextMenuRequested。 通过该功能,你可以有不同的项目创建不同的上下文菜单。

下面是我的项目可能会有所帮助的一个缩短的一些伪代码杂交:

void MyModel::OnContextMenuRequested(const QModelIndex& index, const QPoint& globalPos)
{
// find 'node' corresponding to 'index'

vector<pair<string,BaseNode*> > actions = node->GetActions(true);
if(actions.size()==0) return;

// the ptr list helps us delete the actions
boost::ptr_list<QObject> actionPtrList;
QList<QAction*> qtActions;
for(unsigned int i=0;i<actions.size();i++)
{
    QAction* act = new QAction(actions[i].first.c_str(),NULL);
    act->setData(qVariantFromValue(actions[i].second));
    actionPtrList.push_back(act);
    qtActions.append(act);
}

// create and show the context menu
QMenu *menu = new QMenu("Item actions",NULL);
actionPtrList.push_back(menu);
QAction* act = menu->exec(qtActions,globalPos);
if(act==NULL) return;

// act on the resulting action 'act'
}


Answer 4:

对于那些谁喜欢使用Designer的更多,这里是另一种方式来做到这一点:

1)设置上下文菜单的政策定义上下文菜单

无论是代码:

ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

或使用图形设计,点击树部件和使用属性编辑器设置:

2)创建处理程序功能

在Designer中,右键单击treeWidget并选择“转到插槽...”选项。 类似这样会出现一个窗口:

点击 “CustomContextMenuRequested(QPoint)” 选项。 处理函数将被定义,声明,它会自动连接。

void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
  // this function will be called on right click
}

这一步也可以通过定义和连接槽函数自己完成。

3)创建上下文菜单上的选项。

转到动作编辑器标签(通常停靠在设计师的底部)。 添加要通过点击左上角的新按钮,有上下文菜单中的操作。 你会遇到这样的界面:

您可以(可选)有动作的提示或图标,或使其可检查。 你可以像箱子按Ctrl + C快捷方式,用于复制动作。

4)创建菜单,启动它

void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
    QMenu menu(this); // add menu items
    menu.addAction(ui->actionDelete);
    menu.addEdit(ui->actionDelete);
    ...

    ui->actionDelete->setData(QVariant(pos)); // if you will need the position data save it to the action

    menu.exec( ui->treeWidget->mapToGlobal(pos) );
}

5)为每个操作创建处理函数

就像在步骤2中,创建插槽功能和手动连接,或上一个动作单击鼠标右键,单击“转到插槽...”选项,并选择触发()插槽。

6最后,运用你的逻辑在插槽功能

void MainWindow::on_actionEdit_triggered()
{
    QTreeWidgetItem *clickedItem = ui->treeWidget->itemAt(ui->actionDelete->data().toPoint());

    // your logic
}


文章来源: QTreeWidget right click menu