Qt QGraphicsProxyWidget在QGraphicscene中剪切了上下文菜单

Qt QGraphicsProxyWidget在QGraphicscene中剪切了上下文菜单,qt,opengl,qgraphicsscene,qt5,Qt,Opengl,Qgraphicsscene,Qt5,以下代码基于图形视图框架的文档。我在QGraphicscene中嵌入QLineEdit并运行程序。当我在场景中右键单击“线编辑”时,会得到一个剪裁的上下文菜单。QGraphicsProxyWidget的上下文菜单由场景作为子QGraphicsProxyWidget绘制,因此,如果窗口太小,它将被剪裁。我希望所有嵌入的小部件都能像不嵌入QGraphicscene时一样,将其上下文菜单显示为顶级窗口。我用两种方法尝试了BypassGraphicsProxyWidget标志,但它没有按我所希望的那样工

以下代码基于图形视图框架的文档。我在QGraphicscene中嵌入QLineEdit并运行程序。当我在场景中右键单击“线编辑”时,会得到一个剪裁的上下文菜单。QGraphicsProxyWidget的上下文菜单由场景作为子QGraphicsProxyWidget绘制,因此,如果窗口太小,它将被剪裁。我希望所有嵌入的小部件都能像不嵌入QGraphicscene时一样,将其上下文菜单显示为顶级窗口。我用两种方法尝试了BypassGraphicsProxyWidget标志,但它没有按我所希望的那样工作。在Linux和Windows上的Qt4.8/5.0上测试。所有平台上都存在同样的问题

如何使嵌入式小部件以本机外观显示正常的顶级上下文菜单?重载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();
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
QsCENE场景;
QGraphicsProxyWidget*proxy=scene.addWidget(新的QLineEdit(),Qt::BypassGraphicsProxyWidget);
QGraphicsView视图(和场景);
view.setWindowFlags(Qt::BypassGraphicsProxyWidget);
view.show();
返回app.exec();
}

不幸的是,这是一个已知的错误。错误报告的最后一条注释中建议了一种解决方法。

通过添加设置了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
\ifndef QGLPARENT\u H
#定义QGLPARENT_H
#包括
#包括
#包括
#包括
类QGLParent:公共QGraphicsView
{
私人:
QGraphicsProxyWidget*子组件;
公众:
QGLParent(QWidget*父,QWidget*子):QGraphicsView(父)
{
setFrameShape(QFrame::NoFrame);
QGL格式(QGL::SampleBuffers);
格式.setSwapInterval(1);
setScene(新的qgraphicscene());
setViewport(新的QGLWidget(格式));
//setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
child->setWindowFlags(Qt::BypassGraphicsProxyWidget);
此->子对象=场景()->addWidget(子对象);
}
受保护的:
void resizeEvent(QResizeEvent*事件)
{
场景()->setscen直立(QRect(QPoint(0,0),event->size());
子项->调整大小(事件->大小().width(),事件->大小().height());
QGraphicsView::resizeEvent(事件);
}
};
#恩迪夫

我发现您必须添加一个设置了旁路标志的QWidget,然后对于它的子项,上下文菜单将是本机菜单。解决了的。