如何让QComboBox有上下文菜单?

时间:2013-07-25 02:42:31

标签: qt contextmenu qcombobox

我有一个Qt组合框。弹出时,会列出项目。右键单击某个项目时,我希望弹出一个上下文菜单。有没有办法实现呢?我在QComboBox下找到了一个函数onContextMenuEvent。有帮助吗?感谢。

1 个答案:

答案 0 :(得分:4)

您可以使用QComboBox::view获取列表小部件。您可以照常将上下文菜单添加到列表中。但是你也应该在视图的视口上安装事件过滤器并阻止右键单击事件,因为这样的事件会导致弹出列表关闭。

在初始化中:

QAbstractItemView* view = ui->comboBox->view();
view->viewport()->installEventFilter(this);
view->setContextMenuPolicy(Qt::CustomContextMenu);
connect(view, SIGNAL(customContextMenuRequested(QPoint)), 
        this, SLOT(list_context_menu(QPoint)));

事件过滤器:

bool MainWindow::eventFilter(QObject *o, QEvent *e) {
  if (e->type() == QEvent::MouseButtonRelease) {
    if (static_cast<QMouseEvent*>(e)->button() == Qt::RightButton) {
      return true;
    }
  }
  return false;
}

在插槽中:

void MainWindow::list_context_menu(QPoint pos) {
  QAbstractItemView* view = ui->comboBox->view();
  QModelIndex index = view->indexAt(pos);
  if (!index.isValid()) { return; }
  QMenu menu;
  QString item = ui->comboBox->model()->data(index, Qt::DisplayRole).toString();
  menu.addAction(QString("test menu for item: %1").arg(item));
  menu.exec(view->mapToGlobal(pos));
}

在此示例中,项目由其显示的文本标识。但您也可以使用QComboBox::setItemData将其他数据附加到项目中。您可以使用ui->comboBox->model()->data(...)中使用的角色setItemData来检索此数据。