QT自定义右键菜单

QWidget可以自定义右键菜单。需要设置QWidget的

contextMenuPolicy属性,类型为Qt::ContextMenuPolicy
Qt::ContextMenuPolicy表示右键菜单的策略,可以取如下值:

  • Qt::NoContextMenu  本对象不显示右键菜单,由父对象决定。
  • Qt::PreventContextMenu  不显示右键菜单,与NoContentMenu不同,不向上层传递右键菜单的命令。
  • Qt::DefaultContextMenu  调用QWidget::contextMenuEvent()
  • Qt::ActionsContextMenu 将本QWidget的所有QAction作为菜单项
  • Qt::CustomContextMenu  发送信号QWidget::customContextMenuRequested()

如果需要根据调用右键菜单的不同位置而确定右键菜单的显示内容,就需要使用Qt::CustomContextMenu方式,并自定义槽函数响应customContextMenuRequested()信号。
例如,我要实现右击QListView的列表项上才显示右键菜单,就要在槽函数中首先判断点击位置是否是列表项,使用QListView::indexAt()判断。如果返回的QModelIndex有效,则说明点击时间发生在视图中的某项上。然后创建用于右键菜单的各个QAction。调用QMenu::exec()函数显示菜单。信号传来的position基于local_test_view控件,需要将其转换成全局坐标:ui->local_test_view->mapToGlobal(position)。
代码如下:
[cpp]
void MainWindow::slotLocalTestViewContextMenu(const QPoint &position)
{
QModelIndex index=ui->local_test_view->indexAt(position);
if(!index.isValid())
{
qDebug()«“slotLocalTestViewContextMenu: index is not valid”; return; } QList<qaction *> actions;
QAction *action_create_data_set=new QAction(this);
action_create_data_set->setObjectName(QString::fromLocal8Bit(“action_create_data_set”));
action_create_data_set->setText(tr(“Create data set…”));
action_create_data_set->setEnabled(true);
actions.append(action_create_data_set);
QAction *action_show_test_detail=new QAction(this);
action_show_test_detail->setObjectName(QString::fromLocal8Bit(“action_show_test_detail”));
action_show_test_detail->setText(“Show test detail…”);
action_show_test_detail->setEnabled(false);
actions.append(action_show_test_detail);
QAction result_action = QMenu::exec(actions,ui->local_test_view->mapToGlobal(position));
if(result_action == action_create_data_set)
{
QStringList selected_test_names;
selected_test_names.append(index.data(QFileSystemModel::FilePathRole).toString());
CreateDataSetDialog dialog(core_app_context,this);
dialog.exec();
}
if(result_action==action_show_test_detail)
{
qDebug()«“Hasn’t implemented!”; } foreach(QAction
action, actions) { action->deleteLater();
}
return;
}
[/cpp]
最后在主窗体构造函数中将子控件local_test_view的customContextMenuRequested()信号与上面的槽函数相连,就可以实现右键菜单显示。
[cpp]
connect(ui->local_test_view, SIGNAL(customContextMenuRequested(QPoint)),this, SLOT(slotLocalTestViewContextMenu(QPoint)));
[/cpp]