2014-06-17 45 views
11

我有一段代码调用mousePressEvent。我有左键单击输出光标的坐标,我有rightclick做同样的事情,但我也想要右键单击打开一个上下文菜单。我到目前为止的代码是:Qt中的rightclick事件来打开上下文菜单

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

    } 

} 

我知道我的问题在本质上是非常基本的,而“文本菜单”未正确申报。我将许多来源的代码拼凑在一起,并不知道如何在C++中声明某些内容。任何建议将不胜感激。

回答

22

customContextMenuRequested在widget的contextMenuPolicy为Qt::CustomContextMenu时发出,并且用户已经在widget上请求了上下文菜单。因此,在您的小部件的构造函数中,您可以拨打setContextMenuPolicy并将customContextMenuRequested连接到插槽以创建自定义上下文菜单。

plotspace构造:

this->setContextMenuPolicy(Qt::CustomContextMenu); 

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

ShowContextMenu时隙应当是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)); 
}