Je dois afficher un menu contextuel à chaque fois qu'un onglet est cliqué et doit réagir à cet onglet spécifique. Y a-t-il un moyen de le faire sans sous-classement? P>
4 Réponses :
Je pense que vous devez créer votre propre classe qui hérite de qtabwidget et remplacer la fonction protégée de la souris à utiliser (qmouseevent) dans laquelle vous pouvez créer votre menu contextuel le clic droit. P>
-1 Puisqu'il a spécifiquement demandé une façon de réaliser ce qu'il veut sans sous-classement qtabwidget.
S'il n'est pas familier avec l'inventéfilter, l'héritage est un moyen plus facile. Mais laissez-le essayer votre deuxième solution en premier.
Easy Way, mais éventuellement pas précisément ce dont vous avez besoin: p>
Ceci obtiendra une fonction appelée chaque fois que l'onglet est modifié (pas nécessairement cliqué sur) et augure un menu à la position actuelle de la souris. P>
manière compliquée, qui fait exactement ce que vous décrivez: p>
Votre première solution facile ne fonctionne pas comme il le souhaite. Le menu contextuel ne sera pas affiché est le clic de la souris est effectué sur l'onglet Courant. La seule solution semble être la deuxième.
Créer un QMENU:
m_tabWidget->tabBar()->currentIndex()
Selon le commentaire de @ptrzio Berkerle, la solution trouvée à https://www.qtcentre.org/threads/16703-qtabbar-Context-Menu-on-tab?p=84057#pospost84057 a très bien fonctionné pour moi. (En fait, c'était le seul qui a fonctionné du tout.)
Le code de la poste (par "Spirit"): P>
... m_tabBar = new QTabBar(); m_tabBar->addTab(tr("OK")); m_tabBar->addTab(tr("NO")); m_tabBar->addTab(tr("IGNORE")); m_tabBar->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_tabBar, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showContextMenu(const QPoint &))); ... void Test::showContextMenu(const QPoint &point) { if (point.isNull()) return; int tabIndex = m_tabBar->tabAt(point); QMenu menu(this); if (!tabIndex) menu.addAction(tr("OK")); else if (tabIndex == 1) menu.addAction(tr("NO")); else if (tabIndex == 2) menu.addAction(tr("IGNORE")); menu.exec(m_tabBar->mapToGlobal(point)); }
qtcentre.org/threads/... < / a> (commentaire n ° 5) fonctionne bien!