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é.

Était-ce utile?

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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top