我该如何解决错误,说明创建图形对象没有放置在图形场景中

How can I fix the error saying Created graphical object was not placed in the graphics scene

本文关键字:图形 对象 创建 说明 何解决 解决 错误      更新时间:2023-10-16

我有一个奇怪的错误是由看似简单的问题引起的。

在我的源代码中,我试图使用qquickpainteditem来渲染Qwidget派生类(qpushbutton(的整体外观,然后将其涂在QquickpaintedItem

这样做我遇到了这个错误:

qqmlcomponent:创建的图形对象未放置在图形中 场景。

接下来是:

该程序意外完成。

这是我试图创建我的特殊Qquickpainteditem的上下文以及它的源代码:

main.qml

import QtQuick 2.9
import com.particletool 1.0
import QtQuick.Particles 2.0
import QtQuick.Window 2.3
import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Controls 1.4 as QQ1
  Item {
     id: root
     width: Screen.width
     height: Screen.height
     WidgetInterface {
        id: w
     }
   }

widgetinterface.h

#ifndef WIDGETINTERFACE_H
#define WIDGETINTERFACE_H
#include <QObject>
#include <QQuickItem>
#include <QQuickPaintedItem>
#include <QWidget>
#include <QPushButton>
#include <QtQuick>
class WidgetInterface : public QQuickPaintedItem
{
public:
    WidgetInterface(QQuickItem *parent = nullptr, QWidget* renderWidget = nullptr);
    QWidget* m_widget;
    QPushButton* m_button;
protected:
    void paint(QPainter* painter);
public slots:
   void morphIntoButton(QString txt);
};
#endif // WIDGETINTERFACE_H

widgetinterface.cpp

#include "widgetinterface.h"
#include <QQuickPaintedItem>
#include <QObject>
#include <QPainter>
#include <QWidget>
#include <QPushButton>
WidgetInterface::WidgetInterface(QQuickItem *parent, QWidget* renderWidget) : QQuickPaintedItem(parent), m_widget(renderWidget)
{
    morphIntoButton("test");
    QQmlEngine::setObjectOwnership(m_button, QQmlEngine::JavaScriptOwnership);
}
void WidgetInterface::paint(QPainter *painter)
{
    if (m_widget != nullptr) {
        painter->end();
        m_button->render(painter);
    } else {
    }
}

void WidgetInterface::morphIntoButton(QString txt)
{
    m_widget->setGeometry(0,0, this->width(), this->height());
    m_button = new QPushButton(m_widget);
    m_button->setGeometry(m_widget->geometry());
    m_button->setText(txt);
    this->update(this->boundingRect().toRect());
}

main.cpp

#include <QtGui/QGuiApplication>
#include <QApplication>
#include <QtQml/QQmlApplicationEngine>
#include "src/interfaces/widgetinterface.h"
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
      qmlRegisterType<WidgetInterface>("com.particletool", 1, 0, "WidgetInterface");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

预期的结果是将一个按钮绘制在QML场景图上有人知道如何使用某种方法来实现这一目标吗?(我知道它不受QT的支持,但是我正在尝试实施一种实现这一目标的方法,所以不要用"您不能"的答案,因为我确定有一种方法。

预期的结果是将按钮绘制到QML场景图

class WidgetInterface : public QQuickPaintedItem
{
public:
    WidgetInterface(QQuickItem *parent = Q_NULLPTR) :
        QQuickPaintedItem(parent)
    {
        mButton = new QPushButton("TEST", Q_NULLPTR);
        auto resize = [=](){
            mButton->setGeometry(QRect(QPoint(), boundingRect().size().toSize()));
            QPixmap p(mButton->size());
            mButton->render(&p);
            if(!p.isNull())
                mButtonPix = p;
            update();
        };
        connect(this, &QQuickPaintedItem::widthChanged,  this, resize, Qt::QueuedConnection);
        connect(this, &QQuickPaintedItem::heightChanged, this, resize, Qt::QueuedConnection);
    }
    ~WidgetInterface() {
        mButton->deleteLater();
    }
protected:
    void paint(QPainter* painter){
        painter->drawPixmap(0, 0, mButtonPix);
    }
private:
    QPushButton* mButton;
    QPixmap      mButtonPix;
};