web-dev-qa-db-fra.com

événement clic droit dans Qt pour ouvrir un menu contextuel

J'ai un segment de code qui appelle un mousePressEvent. J'ai le clic gauche pour sortir les coordonnées du curseur, et j'ai le clic droit faire de même, mais je veux aussi que le clic droit ouvre un menu contextuel. Le code que j'ai jusqu'à présent est:

void plotspace::mousePressEvent(QMouseEvent*event)
{
    double trange = _timeonright - _timeonleft;
    int twidth = width();
    double tinterval = trange/twidth;

    int xclicked = event->x();

    _xvaluecoordinate = _timeonleft+tinterval*xclicked;



    double fmax = Data.plane(X,0).max();
    double fmin = Data.plane(X,0).min();
    double fmargin = (fmax-fmin)/40;
    int fheight = height();
    double finterval = ((fmax-fmin)+4*fmargin)/fheight;

    int yclicked = event->y();

    _yvaluecoordinate = (fmax+fmargin)-finterval*yclicked;

    cout<<"Time(s): "<<_xvaluecoordinate<<endl;
    cout<<"Flux: "<<_yvaluecoordinate<<endl;
    cout << "timeonleft= " << _timeonleft << "\n";

    returncoordinates();

    emit updateCoordinates();

    if (event->button()==Qt::RightButton)
    {
            contextmenu->setContextMenuPolicy(Qt::CustomContextMenu);

            connect(contextmenu, SIGNAL(customContextMenuRequested(const QPoint&)),
            this, SLOT(ShowContextMenu(const QPoint&)));

            void A::ShowContextMenu(const QPoint &pos) 
            {
                QMenu *menu = new QMenu;
                menu->addAction(tr("Remove Data Point"), this,  
                SLOT(test_slot()));

                menu->exec(w->mapToGlobal(pos));
            }

    }   

}

Je sais que mon problème est de nature très fondamentale et que le "menu contextuel" n'est pas correctement déclaré. J'ai reconstitué ce code à partir de nombreuses sources et je ne sais pas comment déclarer quelque chose en c ++. Tout avis serait grandement apprécié.

16
ahle6481

customContextMenuRequested est émis lorsque contextMenuPolicy du widget est Qt::CustomContextMenu, et l'utilisateur a demandé un menu contextuel sur le widget. Ainsi, dans le constructeur de votre widget, vous pouvez appeler setContextMenuPolicy et connecter customContextMenuRequested à un emplacement pour créer un menu contextuel personnalisé.

Dans le constructeur de plotspace:

this->setContextMenuPolicy(Qt::CustomContextMenu);

connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), 
        this, SLOT(ShowContextMenu(const QPoint &)));

ShowContextMenu slot doit être un membre de classe de plotspace comme:

void plotspace::ShowContextMenu(const QPoint &pos) 
{
   QMenu contextMenu(tr("Context menu"), this);

   QAction action1("Remove Data Point", this);
   connect(&action1, SIGNAL(triggered()), this, SLOT(removeDataPoint()));
   contextMenu.addAction(&action1);

   contextMenu.exec(mapToGlobal(pos));
}
41
Nejat