【问题标题】:QGraphicsProxyWidget has clipped context menu in QGraphicsSceneQGraphicsProxyWidget 在 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();
}

【问题讨论】:

    标签: qt opengl qgraphicsscene qt5


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多