2012-12-27 4 views
3

다음 코드는 그래픽보기 프레임 워크의 설명서를 기반으로합니다. QLineEdit를 QGraphicsScene에 포함시키고 프로그램을 실행합니다. 장면에서 마우스 오른쪽 버튼으로 편집을 클릭하면 잘린 상황에 맞는 메뉴가 나타납니다. QGraphicsProxyWidget의 상황에 맞는 메뉴는 씬에 의해 자식 QGraphicsProxyWidget으로 그려지기 때문에 윈도우가 너무 작 으면 잘라 버릴 수 있습니다. QGraphicsScene에 포함되어 있지 않을 때와 마찬가지로 모든 내장 위젯에 컨텍스트 메뉴를 최상위 창으로 표시하고자합니다. 두 가지 방법으로 BypassGraphicsProxyWidget 플래그를 시도했지만 원하는대로 작동하지 않습니다. Linux 및 Windows의 Qt 4.8/5.0에서 테스트되었습니다. 모든 플랫폼에서 동일한 문제가 발생합니다.QGraphicsProxyWidget에서 QGraphicsScene의 상황에 맞는 메뉴가 잘림

내장 된 위젯을 기본 모양의 정상적인 최상위 상황에 맞는 메뉴로 표시하려면 어떻게해야합니까? QGraphicsView의 contextMenuEvent 오버로드는 네이티브 최상위 컨텍스트 메뉴를 제공합니다. 일종의 위임을 수행하고 QGraphicsView가 장면에 포함 된 위젯의 컨텍스트 메뉴를 표시 할 수 있습니까?

#include <QApplication> 
#include <QLineEdit> 
#include <QGraphicsScene> 
#include <QGraphicsProxyWidget> 
#include <QGraphicsView> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 

    QGraphicsScene scene; 
    QGraphicsProxyWidget *proxy = scene.addWidget(new QLineEdit(), Qt::BypassGraphicsProxyWidget); 

    QGraphicsView view(&scene); 
    view.setWindowFlags(Qt::BypassGraphicsProxyWidget); 
    view.show(); 

    return app.exec(); 
} 

답변

1

불행히도 이것은 알려진 버그 QTBUG-10683입니다. 버그 보고서에 대한 마지막 코멘트에 해결 방법이 제시되어 있습니다.

+1

우회 플래그가 설정된 QWidget을 추가해야한다는 것을 알았습니다. 자식을 위해 컨텍스트 메뉴가 기본 메뉴입니다. 해결 됐어. – user1284878

1

Qt :: BypassGraphicsProxyWidget이 설정된 QWidget을 추가하여 기본 컨텍스트 메뉴를 얻을 수 있습니다. 아이들은 컨텍스트 메뉴를 팝업 네이티브 스타일로 렌더링합니다.

#ifndef QGLPARENT_H 
#define QGLPARENT_H 

#include <QGLWidget> 
#include <QGraphicsScene> 
#include <QGraphicsProxyWidget> 
#include <QGraphicsView> 

class QGLParent : public QGraphicsView 
{ 
private: 
    QGraphicsProxyWidget *child; 
public: 
    QGLParent(QWidget *parent, QWidget *child) : QGraphicsView(parent) 
    { 
     setFrameShape(QFrame::NoFrame); 
     QGLFormat format(QGL::SampleBuffers); 
     format.setSwapInterval(1); 

     setScene(new QGraphicsScene()); 
       setViewport(new QGLWidget(format)); 
       //setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 

     child->setWindowFlags(Qt::BypassGraphicsProxyWidget); 
     this->child = scene()->addWidget(child); 
    } 
protected: 
    void resizeEvent(QResizeEvent *event) 
    { 
     scene()->setSceneRect(QRect(QPoint(0, 0), event->size())); 
     child->resize(event->size().width(), event->size().height()); 
     QGraphicsView::resizeEvent(event); 
    } 
}; 

#endif