对于那些更喜欢使用设计器的人,这里有另一种方法:
1) 将上下文菜单策略设置为自定义上下文菜单
通过代码:
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
或使用图形设计器,单击树小部件并使用属性编辑器进行设置:
2) 创建处理函数
在设计器中,右键单击 treeWidget 并选择“Go to Slot...”选项。会出现类似这样的窗口:
单击“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
}