menu de contexto Qt quebrando seleção no QTreeView
-
05-07-2019 - |
Pergunta
Eu tenho uma classe QTreeView
com um menu de contexto instalado da seguinte forma:
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));
}
No entanto, quando o menu de contexto está sendo exibido o QTreeView
não responderá aos cliques do mouse. Ao clicar em um item na QTreeView
enquanto o menu de contexto é exibido irá remover o menu de contexto, mas não selecionar o item clicado.
Este é especialmente desorientando quando o botão direito sobre um novo item, como o menu de contexto aparece sobre o novo item, mas como o item não foi selecionado o conteúdo do menu de contexto são referentes ao item selecionado anteriormente.
Solução
Você não diz qual versão do Qt que você está usando, mas encontramos o mesmo problema em Qt4.4.0, ele trabalhou em 4.3. O Hotel reportou este Trolltech como um bug 225615
Este ainda é marcado como pendente, por isso, entretanto, eu iria seguir a sugestão de Shy de interceptar o clique direito e fazer a seleção si mesmo.
Outras dicas
Uma solução possível que eu não tenha verificado seria capturar o evento clique do botão direito, fazer manualmente a seleção na exibição em árvore e, em seguida, invocando o clique evento pai que por sua vez ativar o menu de contexto.
subclasse o QTreeView e adicione o método protegido ContextMenuEvent void (QContextMenuEvent * evento); Neste método, você executar um 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());
}