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.

Foi útil?

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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top