[ ОБНОВЛЕНО ]
У вас есть две ошибки при сбое и одна - не отображаются прямоугольники
1.Ваш scene
'* Инициализатор члена конструктораlist - ложь, которая вызывает сбой приложения
( СОВЕТ: используйте разные имена для членов класса, добавив к ним префикс m_
, например: m_engine
для READABILITY а не получить в замешательстве )
//Correct WAY
class Something
{
private:
int m_value1;
double m_value2;
char m_value3;
public:
//################# YOUR CASE ###############################
Something(int number) : m_value1(number), m_value2(2.2), m_value3('c') // directly initialize our member variables
{
// No need for assignment here
}
//#############################################################
Something() : m_value1(1), m_value2(2.2), m_value3('c') // directly initialize our member variables
{
// No need for assignment here
}
void print()
{
std::cout << "Something(" << m_value1 << ", " << m_value2 << ", " << m_value3 << ")\n";
}
}
и должно быть так:
scene::scene(QQmlApplicationEngine &engine, QObject *parent) : engine(engine),QObject(parent)
вместо
scene::scene(QQmlApplicationEngine &engine, QObject *parent) : engine(this->engine),QObject(parent)
2. * url
из myrect.qml
, которые вы получаете из локального файла, который не найден в время выполнения вызвало аварийное завершение приложения, и одним из способов является его загрузкаиз вашего qrc
файла
QQmlComponent component(&engine, QUrl("qrc:/myrect.qml"));
3. И вы заметите, что после щелчка у вас нет прямоугольников, потому что у создаваемых прямоугольников нет родителя, и изменив свой create_rect_object()
(В этомпример родительский - это невидимый корень нашего окна contentItem
) вы получите несколько прямоугольников:)
//A QQuickWindow always has a single invisible root item containing all of its content.
//To add items to this window, reparent the items to the contentItem or to an existing item in the scene.
//http://doc.qt.io/qt-5/qquickwindow.html#contentItem-prop
void scene::create_rect_object()
{
QQmlComponent component(&engine, QUrl("qrc:/myrect.qml"));
QObject *object = component.create();
QQuickItem *item = qobject_cast<QQuickItem*>(object);
// Set the parent of our created qml rect
item->setParentItem((QQuickItem*)((QQuickWindow *) engine.rootObjects()[0])->contentItem());
//Set some random position and color
item->setProperty("color", QColor::fromRgb(QRandomGenerator::global()->generate()));
item->setX(20+qFloor(QRandomGenerator::global()->generateDouble()*20));
item->setY(20+qFloor(QRandomGenerator::global()->generateDouble()*20));
}
Поиск объектов QMLиз C ++
Чтобы найти объекты и использовать их как parentItem
, вы должны установить objectName
вашего объекта qml
Rectangle {
...
objectName : "rect_1"
...
}
и в C ++
QObject* obj = dynamic_cast<QObject*>(engine.rootObjects()[0]).findChild("rect_1");