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.

¿Fue útil?

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());
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top