2014-06-17 15 views
11

Tôi có một đoạn mã gọi hàm mousePressEvent. Tôi có đầu ra nhấp chuột trái các tọa độ của con trỏ, và tôi có rightclick làm như vậy, nhưng tôi cũng muốn có rightclick mở một menu ngữ cảnh. Mã tôi có cho đến nay là:sự kiện rightclick trong Qt để mở menu ngữ cảnh

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

    } 

} 

Tôi biết rằng vấn đề của tôi rất cơ bản trong tự nhiên và 'contextmenu' không được khai báo đúng cách. Tôi đã ghép nối mã này với nhiều nguồn khác nhau, và không biết cách khai báo một cái gì đó trong C++. Mọi lời khuyên sẽ được đánh giá cao.

Trả lời

22

customContextMenuRequested được phát ra khi ngữ cảnh của tiện íchMenuPolicy là Qt::CustomContextMenu và người dùng đã yêu cầu menu ngữ cảnh trên tiện ích. Vì vậy, trong hàm tạo của tiện ích con, bạn có thể gọi setContextMenuPolicy và kết nối customContextMenuRequested với một vị trí để tạo menu ngữ cảnh tùy chỉnh.

Trong constructor của plotspace:

this->setContextMenuPolicy(Qt::CustomContextMenu); 

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

ShowContextMenu khe phải là một thành viên lớp plotspace như:

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)); 
} 
Các vấn đề liên quan