【问题标题】:How to let QComboBox have context menu?如何让 QComboBox 有上下文菜单?
【发布时间】:2013-07-25 02:42:30
【问题描述】:

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

【问题讨论】:

    标签: qt contextmenu qcombobox


    【解决方案1】:

    您可以使用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-&gt;comboBox-&gt;model()-&gt;data(...)setItemData 中使用的角色检索此数据。

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多