QTreeWidget右键菜单

IST*_*STB 9 qt popupmenu qtreewidget

我环顾四周,似乎问题不仅出现在树小部件上,也出现在其他小部件上.但就我而言,我找到了一个解决方案,虽然不完整.我正在向树窗口小部件添加操作,因此当您右键单击它时,会出现带有这些操作的弹出窗口.但是,当我向我的树窗口小部件添加项目并右键单击它们时,会出现相同的弹出窗口.我想要做的是,当您右键单击树窗口小部件时,会出现树窗口小部件弹出菜单,当您右键单击项目时,会出现另一个相应的弹出菜单.有人知道怎么做吗?

han*_*ank 17

首先,您应该将上下文菜单策略设置为CustomContextMenu:

treeView->setContextMenuPolicy(Qt::CustomContextMenu);
Run Code Online (Sandbox Code Playgroud)

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


小智 16

首先,配置QTreeWidget以响应(发出信号)鼠标右键:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
Run Code Online (Sandbox Code Playgroud)

其次,将信号与您的插槽"MainWindow :: prepareMenu"连接:

connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu);
Run Code Online (Sandbox Code Playgroud)

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

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) );
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您指出`QTreeWidgetItem *nd = tree-&gt;itemAt( pos );`! (2认同)

t.m*_*.m. 7

对于那些更喜欢使用设计师的人,这是另一种方法:

1) 将上下文菜单策略设置为自定义上下文菜单

要么通过代码:

ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
Run Code Online (Sandbox Code Playgroud)

或使用图形设计器,单击树小部件并使用属性编辑器进行设置:

在此处输入图片说明

2)创建Handler函数

在设计器中,右键单击 treeWidget 并选择“Go to Slot...”选项。将出现一个类似的窗口:

在此处输入图片说明

单击“CustomContextMenuRequested(QPoint)”选项。Handler 函数将被定义、声明并自动连接。

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

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

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) );
}
Run Code Online (Sandbox Code Playgroud)

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

像在第 2 步中一样,创建槽函数并手动连接它,或者右键单击某个动作,单击“转到槽...”选项并选择 trigger() 槽。

在此处输入图片说明

6)最后,在槽函数中应用你的逻辑

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

    // your logic
}
Run Code Online (Sandbox Code Playgroud)