我有一个 Qt 组合框。当它弹出时,项目会被列出。当右键单击一个项目时,我希望弹出一个上下文菜单。有什么方法可以实现吗?onContextMenuEvent
我在 QComboBox 下找到了一个函数。它有帮助吗?谢谢。
问问题
2455 次
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 回答