10
votes

Menu contextuel d'onglet Qtabwidget

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?


4 Réponses :


0
votes

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.


2 commentaires

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



5
votes

1 commentaires

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.



3
votes

Créer un QMENU:

m_tabWidget->tabBar()->currentIndex()


0 commentaires

1
votes

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


0 commentaires