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