QtQuick:从c++创建组件
QtQuick: create component from C++
我有一个问题与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;
};
类实现(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);
}
}
这是我的Main.qml
:
import QtQuick 2.0
Rectangle {
width: 1024
height: 768
color: "#000000"
Text {
x: 0
y: 0
color: "#ffffff"
text: "Main page"
}
}
这是我的TextLegacy.qml
:
import QtQuick 2.0
Item {
Rectangle {
x: 0
y: 0
width: 100
height: 50
color: "#ff0000"
}
}
我的代码工作得很好,直到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());
}
}
实际上i->setParent(this);
将i
的父对象定义为QObject
(例如,用于删除目的),而i->setParentItem(_view.rootObject());
实际上将对象添加到场景中,作为场景根对象的子对象。
相关文章:
- 如何创建长度由常量参数指定的数组
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 创建结构的数组时遇到分段错误
- 在c++中为double类型的数组创建一个unique_ptr
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 在将 new 与指针一起使用时,创建数组的指定长度
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 合并排序不排序自创建数组类 c++
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 如何从预定义的数组创建某些元素数组
- 是否可以从C++创建 Qml 组件?
- HDF5:检查创建组
- 在C++/WRL中使用静态方法创建WinRT组件
- 现在创建COM组件的最佳方式是什么
- 将在一行中声明的成员记录在一起,而不创建组
- QML:如何将动态创建的组件与自定义的内部对象一起使用
- 使用MSVSc++创建OLE组件库
- 如何在QTreeWidget中为子组件创建子组件
- c++ /QML:如何为动态创建的组件定义和处理多个上下文