Menu contextuel Qt brisant la sélection dans QTreeView
-
05-07-2019 - |
Question
J'ai une classe QTreeView
avec un menu contextuel installé comme suit:
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));
}
Toutefois, lorsque le menu contextuel est affiché, QTreeView
ne répond plus aux clics de souris. En cliquant sur un élément dans QTreeView
alors que le menu contextuel est affiché, le menu contextuel sera supprimé, mais l'élément sélectionné ne sera pas sélectionné.
Ceci est particulièrement désorientant lorsque vous cliquez avec le bouton droit sur un nouvel élément, le menu contextuel apparaissant au-dessus du nouvel élément, mais comme l'élément n'a pas été sélectionné, le contenu du menu contextuel fait référence à l'élément précédemment sélectionné.
La solution
Vous ne dites pas quelle version de Qt vous utilisez, mais nous avons trouvé le même problème dans Qt4.4.0, cela fonctionnait dans la version 4.3. Nous avons signalé ce problème à Trolltech comme un bogue 225615
Ceci est toujours marqué comme en attente, donc dans l'intervalle, je suivrais la suggestion de Shy d'intercepter le clic droit et de faire la sélection vous-même.
Autres conseils
Une solution possible que je n'ai pas encore vérifiée serait de capturer l'événement click du clic droit, de faire la sélection manuellement dans la vue arborescente, puis de faire appel à l'événement clic parent qui activera à son tour le menu contextuel.
Sous-classez QTreeView et ajoutez la méthode protégée void contextMenuEvent (événement QContextMenuEvent *); Dans cette méthode, vous exécutez 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());
}