Qt QGraphicsProxyWidget在QGraphicscene中剪切了上下文菜单
以下代码基于图形视图框架的文档。我在QGraphicscene中嵌入QLineEdit并运行程序。当我在场景中右键单击“线编辑”时,会得到一个剪裁的上下文菜单。QGraphicsProxyWidget的上下文菜单由场景作为子QGraphicsProxyWidget绘制,因此,如果窗口太小,它将被剪裁。我希望所有嵌入的小部件都能像不嵌入QGraphicscene时一样,将其上下文菜单显示为顶级窗口。我用两种方法尝试了BypassGraphicsProxyWidget标志,但它没有按我所希望的那样工作。在Linux和Windows上的Qt4.8/5.0上测试。所有平台上都存在同样的问题 如何使嵌入式小部件以本机外观显示正常的顶级上下文菜单?重载QGraphicsView的contextMenuEvent提供了一个本机顶级上下文菜单-我可以进行某种委托并使QGraphicsView显示场景中嵌入小部件的上下文菜单吗Qt QGraphicsProxyWidget在QGraphicscene中剪切了上下文菜单,qt,opengl,qgraphicsscene,qt5,Qt,Opengl,Qgraphicsscene,Qt5,以下代码基于图形视图框架的文档。我在QGraphicscene中嵌入QLineEdit并运行程序。当我在场景中右键单击“线编辑”时,会得到一个剪裁的上下文菜单。QGraphicsProxyWidget的上下文菜单由场景作为子QGraphicsProxyWidget绘制,因此,如果窗口太小,它将被剪裁。我希望所有嵌入的小部件都能像不嵌入QGraphicscene时一样,将其上下文菜单显示为顶级窗口。我用两种方法尝试了BypassGraphicsProxyWidget标志,但它没有按我所希望的那样工
#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();
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
QsCENE场景;
QGraphicsProxyWidget*proxy=scene.addWidget(新的QLineEdit(),Qt::BypassGraphicsProxyWidget);
QGraphicsView视图(和场景);
view.setWindowFlags(Qt::BypassGraphicsProxyWidget);
view.show();
返回app.exec();
}
不幸的是,这是一个已知的错误。错误报告的最后一条注释中建议了一种解决方法。通过添加设置了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
\ifndef QGLPARENT\u H
#定义QGLPARENT_H
#包括
#包括
#包括
#包括
类QGLParent:公共QGraphicsView
{
私人:
QGraphicsProxyWidget*子组件;
公众:
QGLParent(QWidget*父,QWidget*子):QGraphicsView(父)
{
setFrameShape(QFrame::NoFrame);
QGL格式(QGL::SampleBuffers);
格式.setSwapInterval(1);
setScene(新的qgraphicscene());
setViewport(新的QGLWidget(格式));
//setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
child->setWindowFlags(Qt::BypassGraphicsProxyWidget);
此->子对象=场景()->addWidget(子对象);
}
受保护的:
void resizeEvent(QResizeEvent*事件)
{
场景()->setscen直立(QRect(QPoint(0,0),event->size());
子项->调整大小(事件->大小().width(),事件->大小().height());
QGraphicsView::resizeEvent(事件);
}
};
#恩迪夫
我发现您必须添加一个设置了旁路标志的QWidget,然后对于它的子项,上下文菜单将是本机菜单。解决了的。