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

Posted

技术标签:

【中文标题】QGraphicsProxyWidget 在 QGraphicsScene 中剪切了上下文菜单【英文标题】:QGraphicsProxyWidget has clipped context menu in QGraphicsScene 【发布时间】:2012-12-27 23:40:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我发现您必须添加一个设置了绕过标志的 QWidget,然后对于它的子级,上下文菜单将是本机菜单。解决了。​​【参考方案2】:

您可以通过添加一个设置了 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

【讨论】:

以上是关于QGraphicsProxyWidget 在 QGraphicsScene 中剪切了上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 QGraphicsScene 的小部件(QGraphicsProxyWidget)?

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

QGraphicsProxyWidget 动画不起作用

在 QGraphicsView/QGraphicsScene 中移动 QGraphicsProxyWidget 中的嵌入式小部件

Qt QGraphicsProxyWidget隐藏其他QGraphicsProxyWidgets

QT QGraphicsProxyWidget对象可选择或移动的一些tricks