我该如何解决错误,说明创建图形对象没有放置在图形场景中
How can I fix the error saying Created graphical object was not placed in the graphics scene
我有一个奇怪的错误是由看似简单的问题引起的。
在我的源代码中,我试图使用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;
};
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 我该如何解决错误,说明创建图形对象没有放置在图形场景中
- 将 OpenGL 实例化图形与移动对象一起使用
- 有没有办法在更改与 HDC 关联的位图大小后更新图形对象?
- 如何在涡轮C 图形中设置对象的自定义边框宽度
- 如何快速绘制10000 2D图形对象
- 在Boost Graph中定义了图形后,在构造函数中初始化了effled_graph对象
- 添加可绘制对象层以将逻辑与图形分离
- QT - 拖放 - 在自定义场景上创建自定义图形对象的位置
- 用于渲染不同类型的图形对象的引擎
- boost::d ynamic_properties 和不可变的图形对象
- 如何使用窗口的C++图形(GDI+)库移动对象?
- 无法在C++图形中绘制对象
- python中基于对象的图形表示
- 从gdiplus (GDI+)中的设备上下文或图形对象中获取图像/位图
- GDI+图形对象-当用GDI直接绘制到DC时,抗混叠丢失
- 相邻列表自引用到图形对象
- 通过boost发送一个简单的boost图形对象:MPI得到错误
- 为带有3d对象的图形设置合适的坐标