Mor*_*Dev 1 c++ qt qt-quick qt5 qtquick2
我有 QQuickView 从 C++ 实例化组件的问题......这是我的代码:
类定义 ( vviewerqml.h):
class VViewerQml : public QObject
{
Q_OBJECT
public:
explicit VViewerQml(QSettings &systemSettings, QObject *parent = 0);
~VViewerQml();
protected slots:
void onViewStatusChanged(QQuickView::Status status);
protected:
QString _qmlFolder;
QQuickView _view;
};
Run Code Online (Sandbox Code Playgroud)
类实现(vviewerqml.cpp):
#include "vviewerqml.h"
VViewerQml::VViewerQml(QSettings &systemSettings, QObject *parent) :
QObject(parent)
{
// Initialize viewer reading from settings file
_qmlFolder = "/my/path/to/qml/files";
// Initialize the source
connect(&_view, SIGNAL(statusChanged(QQuickView::Status)),
this, SLOT(onViewStatusChanged(QQuickView::Status)));
_view.setSource(QUrl::fromLocalFile(QDir(_qmlFolder).filePath("Main.qml")));
// Show the viewer
_view.show();
}
VViewerQml::~VViewerQml()
{
// Close the viewer
_view.close();
}
void VViewerQml::onViewStatusChanged(QQuickView::Status status)
{
if(status == QQuickView::Ready)
{
QQmlComponent *c =
new QQmlComponent(_view.engine(),
QDir(_qmlFolder).filePath("TextLegacy.qml"));
QQuickItem *i = qobject_cast<QQuickItem*>(c->create());
QQmlEngine::setObjectOwnership(i, QQmlEngine::CppOwnership);
i->setParent(_view.rootObject());
i->setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Main.qml:
import QtQuick 2.0
Rectangle {
width: 1024
height: 768
color: "#000000"
Text {
x: 0
y: 0
color: "#ffffff"
text: "Main page"
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的TextLegacy.qml:
import QtQuick 2.0
Item {
Rectangle {
x: 0
y: 0
width: 100
height: 50
color: "#ff0000"
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码工作正常,直到加载Main.qml:QML 查看器在屏幕上打开,我可以在我的屏幕上阅读文本“主页”(黑底白字)......但不幸的是我无法加载TextLegacy.qml......如果我在onViewStatusChanged函数中放置了一个断点,执行到了那个点......调试控制台中没有显示任何可见的错误......但我无法在屏幕上看到TextLegacy.qml......提供的红色矩形
我错过了什么?有人可以提供一些帮助吗?
好的,我自己找到了解决方案:我混淆setParent了setParentItem......正确的代码是:
void VViewerQml::onViewStatusChanged(QQuickView::Status status)
{
if(status == QQuickView::Ready)
{
QQmlComponent *c = new QQmlComponent(_view.engine(),
QUrl::fromLocalFile(QDir(_qmlFolder).filePath("TextLegacy.qml")));
QQuickItem *i = qobject_cast<QQuickItem*>(c->create());
QQmlEngine::setObjectOwnership(i, QQmlEngine::CppOwnership);
i->setParent(this);
i->setVisible(true);
i->setParentItem(_view.rootObject());
}
}
Run Code Online (Sandbox Code Playgroud)
实际上i->setParent(this);将 的父对象定义i为 a QObject(例如,出于删除目的),而i->setParentItem(_view.rootObject());实际上将对象添加到场景中,作为场景根对象的子对象。
| 归档时间: |
|
| 查看次数: |
2791 次 |
| 最近记录: |