0

我想在我的 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);   
}
4

1 回答 1

2

解决方案

为了在您的QGraphicsWidget子类中嵌入一个小部件,例如QPushButton ,请使用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->addWidget(new QPushButton("Test Test"));,这本质上是相同的:

QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget();

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

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

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

注意:不需要调用QGraphicsScene::addItem ,因为(由于父/子关系)代理将与您的自定义QGraphicsWidget一起添加到场景中。


结果

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

在此处输入图像描述

于 2018-08-23T21:16:01.643 回答