El menú contextual de Qt rompe la selección en QTreeView
-
05-07-2019 - |
Pregunta
Tengo una clase QTreeView
con un menú contextual instalado de la siguiente manera:
m_ui.tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ui.tree, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(ShowTreeContextMenu(const QPoint&)));
...
void ShowTreeContextMenu(const QPoint& point)
{
m_treeContextMenu->exec(m_ui.tree->viewport()->mapToGlobal(point));
}
Sin embargo, cuando se muestra el menú contextual, QTreeView
ya no responderá a los clics del mouse. Al hacer clic en un elemento del QTreeView
mientras se muestra el menú contextual, se eliminará el menú contextual pero no se seleccionará el elemento seleccionado.
Esto es especialmente desorientador cuando se hace clic con el botón derecho en un nuevo elemento, ya que el menú contextual aparece sobre el nuevo elemento, pero como el elemento no se seleccionó, el contenido del menú contextual se refiere al elemento seleccionado previamente.
Solución
No dice qué versión de Qt está utilizando, pero encontramos el mismo problema en Qt4.4.0, funcionó en 4.3. Informamos esto a Trolltech como un error 225615
Esto todavía está marcado como pendiente, así que mientras tanto seguiría la sugerencia de Shy de interceptar el clic derecho y hacer la selección tú mismo.
Otros consejos
Una posible solución que no he verificado sería capturar el evento de clic del botón derecho, hacer la selección manualmente en la vista de árbol y luego invocar el evento de clic primario que a su vez activará el menú contextual.
Subclase QTreeView y agregue el método protegido void contextMenuEvent (QContextMenuEvent * event); En este método ejecutas un QMenu:
class TreeView : public QTreeView{
Q_OBJECT
public:
TreeView(QWidget *parent);
~TreeView();
protected:
void contextMenuEvent(QContextMenuEvent *event);
};
void TreeView::contextMenuEvent(QContextMenuEvent *event){
QMenu menu(this);
menu.addAction(action1);
menu.addAction(action2);
//...
menu.addAction(actionN);
menu.exec(event->globalPos());
}