3

以下代码基于 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();
}
4

2 回答 2

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
于 2012-12-29T19:29:52.017 回答
1

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

于 2012-12-28T00:44:21.183 回答