我有一个Qt组合框。弹出时,会列出项目。右键单击某个项目时,我希望弹出一个上下文菜单。有没有办法实现呢?我在QComboBox下找到了一个函数onContextMenuEvent
。有帮助吗?感谢。
答案 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
来检索此数据。