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 中剪切了上下文菜单
在 QGraphicsView/QGraphicsScene 中移动 QGraphicsProxyWidget 中的嵌入式小部件