我有一个名为"SingleTile.qml";具有以下内容
import QtQuick 2.15
Item {
width: 100; height: 100
Rectangle {
anchors.centerIn: parent
color: "green"
}
}
单击按钮后,我执行以下操作来创建SingleTile.qml 的实例
QQmlEngine engine;
QQmlComponent component(&engine,
QUrl::fromLocalFile("SingleTile.qml"));
QQuickItem *object = qobject_cast<QQuickItem*>(component.create());
object->setProperty("color", "blue");
但这不会在屏幕上显示任何绿色或蓝色的矩形。为什么?
请注意,SingleTile组件中存在错误。首先,绿色矩形{}实际上没有宽度和高度。要更正该错误,您需要将anchors.centerIn: parent
更改为anchors.fill: parent
。另一个问题是无法更改颜色,因为父项没有color
属性。要解决这个问题,您应该使用属性别名之类的东西从矩形中弹出该属性。
//SingleTile.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
Item {
width: 100; height: 100
property alias color: rect.color
Rectangle {
id: rect
anchors.fill: parent
color: "green"
}
}
您是否需要在c++中动态创建组件?如果按钮点击是在QML中完成的,您可以在QML完全处理组件的动态创建和删除。
有一个Qt页面记录了该方法https://doc.qt.io/qt-6/qtqml-javascript-dynamicobjectcreation.html
但是,如果您想避免这种复杂性,可以考虑将动态创建作为ListModel和委托的一个问题进行重新设计,如下所示。当您添加到ListModel时,委托将自动实例化组件的新实例。当您从ListModel中删除时,组件的实例将自动删除。
我使用这个QML在线服务,它演示了SingleTile的动态创建和删除。由于我使用这个QML在线服务,它要求我将所有内容都放在一个文件中,因此,我将SingleTile实现为一个内联组件,而不是一个单独的文件。
import QtQuick 2.15
import QtQuick.Controls 2.15
Page {
Repeater {
model: listModel
delegate: SingleTile {
x: tileX
y: tileY
color: tileColor
Text {
text: "X"
anchors.right: parent.right
color: "white"
MouseArea {
anchors.fill: parent
onClicked: listModel.remove(index)
}
}
}
}
ListModel {
id: listModel
}
Button {
text: qsTr("Create")
onPressed: {
let tileX = Math.floor(Math.random() * parent.width);
let tileY = Math.floor(Math.random() * parent.height);
let tileColor = ["green", "blue"][Math.floor(Math.random() * 2)];
listModel.append( { tileX, tileY, tileColor } );
}
}
}
//SingleTile.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
Item {
width: 100; height: 100
property alias color: rect.color
Rectangle {
id: rect
anchors.fill: parent
color: "green"
}
}
你可以在线试用!
很抱歉,我不知道你的问题到底是什么,因为你没有提供足够的信息。
但以下是一些可能导致问题的因素:
-
QUrl::fromLocalFile在应用程序的位置创建一个到给定文件的绝对路径。在您的情况下,我宁愿只使用带有"的构造函数;qrc:/SingleTile.qml";这将创建到Qt资源系统的相对路径。
-
您应该在构建您的QQmlComponent之后通过调用";isError"以及";errorString";。
-
您需要通过设置";"父";属性通过";setProperty";或";setParentItem";,否则,项目就无法可视化。