Можно ли встроить QWidget в пользовательский QGraphicsWidget?

Я хотел бы встроить QWidget, такой как кнопка или индикатор выполнения, в мой QGraphicswidget, но я видел только примеры добавления 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);   
}

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->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 Метод, результат похож на это:

введите описание изображения здесь

Другие вопросы по тегам