Selezione contestuale del menu di scelta rapida Qt in QTreeView
-
05-07-2019 - |
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.
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());
}