Domanda

Ho una classe QTreeView con un menu contestuale installato come segue:

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));
}

Tuttavia, quando viene visualizzato il menu di scelta rapida, QTreeView non risponderà più ai clic del mouse. Facendo clic su un elemento in QTreeView mentre è visualizzato il menu contestuale, il menu contestuale verrà rimosso ma non verrà selezionato l'elemento selezionato.

Ciò è particolarmente disorientante quando si fa clic con il pulsante destro del mouse su un nuovo elemento, poiché il menu di scelta rapida viene visualizzato sopra il nuovo elemento, ma poiché l'elemento non è stato selezionato, i contenuti del menu di scelta rapida si riferiscono all'elemento precedentemente selezionato.

È stato utile?

Soluzione

Non dici quale versione di Qt stai usando, ma abbiamo riscontrato lo stesso problema in Qt4.4.0, ha funzionato in 4.3. Lo abbiamo segnalato a Trolltech come un bug 225615

Questo è ancora contrassegnato come in sospeso, quindi nel frattempo seguirò il suggerimento di Shy di intercettare il tasto destro ed effettuare la selezione da soli.

Altri suggerimenti

Una possibile soluzione che non ho verificato sarebbe quella di catturare l'evento click del clic destro, effettuare manualmente la selezione nella vista ad albero e quindi invocare l'evento click genitore che a sua volta attiverà il menu contestuale.

Sottoclasse QTreeView e aggiungi il metodo protetto void contextMenuEvent (evento QContextMenuEvent *); In questo metodo si esegue 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());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top