QGraphicsProxyWidget在QGraphicsScene中剪切了上下文菜单

时间:2012-12-27 23:40:23

标签: qt opengl qgraphicsscene qt5

以下代码基于Graphics View Framework的文档。我在QGraphicsScene中嵌入了一个QLineEdit并运行该程序。当我右键单击场景中的行编辑时,我得到一个剪切的上下文菜单。 QGraphicsProxyWidget的上下文菜单由场景绘制为子QGraphicsProxyWidget,因此如果窗口太小,它会被剪裁。我希望所有嵌入式小部件都将其上下文菜单显示为顶级窗口,就像它们未嵌入QGraphicsScene时一样。我已经通过两种方式尝试了BypassGraphicsProxyWidget标志,但它不能按我的意愿工作。在Linux和Windows上测试Qt 4.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();
}

2 个答案:

答案 0 :(得分:1)

不幸的是,这是一个已知的错误QTBUG-10683。在错误报告的最后评论中建议了一种解决方法。

答案 1 :(得分: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