是否可以在自定义 QGraphicsWidget 中嵌入 QWidget?

Posted

技术标签:

【中文标题】是否可以在自定义 QGraphicsWidget 中嵌入 QWidget?【英文标题】:Is it possible to embed a QWidget inside of a custom QGraphicsWidget? 【发布时间】:2018-08-23 19:33:56 【问题描述】:

我想在我的 QGraphicswidget 中嵌入一个 QWidget,例如按钮或进度条,但我只看到了将 QWidget 添加到 QGraphicsScene 的示例,即

m_scene->addWidget(new QPushButton("Test Test"));

在我的自定义图形小部件中,我正在绘制函数中绘制文本和其他自定义形状。我认为您需要在此处添加 QWidget,但我可能错了。有谁知道怎么做?

这是我重载的绘制函数:

void TestWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem 
    *option, QWidget *widget /*= 0*/)

    Q_UNUSED(widget);
    Q_UNUSED(option);

    QRectF frame(QPointF(0,0), geometry().size());
    QGradientStops stops;   

    //Draw border
    painter->drawRoundedRect(boundingRect(), 5.0, 5.0);
    //Name of the test
    painter->drawText(40, 20, m_name);

    //Status of test
    QFont font = painter->font() ;
    font.setPointSize(14);
    painter->setFont(font);
    painter->drawText(600, 20, m_status);

    //Arrow button
    QPolygonF poly;
    poly << QPointF(5, 10) << QPointF(25, 10) << QPointF(15, 20 )<< 
    QPointF(5,10);
    painter->setBrush(Qt::black);
    painter->drawPolygon(poly, Qt::OddEvenFill);   

【问题讨论】:

使用QGraphicsProxyWidget 您引用的示例显示了如何将 QWidget 添加到 QGraphicsScene。他们没有展示如何在 QGraphicsWidget 中嵌入 QWidget。 你必须使用:QGraphicsProxyWidgetQGraphicsProxyWidget *proxy = new QGraphicsProxyWidgetproxy-&gt;setWidget(pointer_of_your_widget);m_scene-&gt;addItem(proxy)。见doc.qt.io/qt-5/… @scopchanov 我已经在场景中添加了一个自定义 QGraphicsWidget,我想在该 QGraphicsWidget 中添加一个 QProgressBar。 @scopchanov 我需要绘制大量二维项目,因此常规 QWidgets 将无法工作。希望我需要在我的 QGraphicsWidget 中绘制一个 QWidget 的情况很少(一到两次)。由于我使用的是 QGraphicWidgets 我需要一个 QGraphicScene 来正确绘制它们? 【参考方案1】:

解决方案

为了嵌入一个小部件,例如QPushButton,在您的 QGraphicsWidget 子类中使用 QGraphicsProxyWidget,如下所示:

#include "TestWidget.h"
#include <QGraphicsProxyWidget>
#include <QPushButton>

TestWidget::TestWidget(QGraphicsItem *parent) :
    QGraphicsWidget(parent)

    ...
    auto *proxy = new QGraphicsProxyWidget(this);
    
    proxy->setWidget(new QPushButton(tr("CLick me")));
    proxy->moveBy(20, 40);
    ...


背景

如果你使用m_scene-&gt;addWidget(new QPushButton("Test Test"));,也就是essentially the same:

QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget();

proxy->setWidget(new QPushButton("Test Test"));
m_scene->addItem(proxy);

您将 QPushButton(通过代理)直接添加到场景中

如果您想让 QPushButton 成为自定义 QGraphicsWidget一部分,请设置 QGraphicsProxyWidget 的父级> 到自定义QGraphicsWidget的实例。

注意:不需要调用QGraphicsScene::addItem,因为(由于父子关系)代理会和你的自定义QGraphicsWidget


结果

使用您的paint 方法,结果类似于:

【讨论】:

非常感谢!很高兴您添加了 moveBy 函数来展示如何定位小部件。 @MichaelJapzon,非常欢迎您!如果您还有其他问题,我很乐意提供帮助。 @MichaelJapzon,我建议你发一个新的。

以上是关于是否可以在自定义 QGraphicsWidget 中嵌入 QWidget?的主要内容,如果未能解决你的问题,请参考以下文章

如何滚动自定义 QGraphicsWidget 的所有内容?

是否可以避免在自定义@Query 上进行类型转换?

是否可以在自定义 UITableViewCell 中有一个按钮,该按钮引用其中的选择器

在自定义框架中使用动作脚本打开页面

是否在自定义 HTTP 标头 RESTful 中传递租户?

在自定义模板中动态添加多个剑道下拉列表