1

我有一个 Qt 组合框。当它弹出时,项目会被列出。当右键单击一个项目时,我希望弹出一个上下文菜单。有什么方法可以实现吗?onContextMenuEvent我在 QComboBox 下找到了一个函数。它有帮助吗?谢谢。

4

1 回答 1

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

于 2013-07-25T05:46:01.933 回答