2014-06-17 4 views
11

Ich habe ein Code-Segment, das ein mousePressEvent aufruft. Ich habe die Linksklick-Ausgabe der Koordinaten des Cursors, und ich habe Rechtsklick das gleiche tun, aber ich möchte auch den Rechtsklick ein Kontextmenü öffnen. Der Code, den ich bisher habe, ist:rightclick-Ereignis in Qt, um ein Kontextmenü zu öffnen

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

    } 

} 

Ich weiß, dass mein Problem in der Natur sehr grundlegender Bedeutung ist, und das contextmenu 'nicht richtig erklärt. Ich habe diesen Code aus vielen Quellen zusammengestellt und weiß nicht, wie ich etwas in C++ deklariere. Jeder Rat würde sehr geschätzt werden.

Antwort

22

customContextMenuRequested wird ausgegeben, wenn die contextMenuPolicy des Widgets Qt::CustomContextMenu ist und der Benutzer ein Kontextmenü für das Widget angefordert hat. Sie können also im Konstruktor Ihres Widgets setContextMenuPolicy aufrufen und customContextMenuRequested mit einem Slot verbinden, um ein benutzerdefiniertes Kontextmenü zu erstellen.

Im Konstruktor von plotspace:

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

this->setContextMenuPolicy(Qt::CustomContextMenu); 

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

ShowContextMenu Schlitz ein Klassenmitglied plotspace sein sollte

Verwandte Themen