@Anthony228357

Как в qt qml в создаваемом классе менять свойства qml объектов?

есть файл main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle{
        x: 100
        y: 300
        width: 100;
        height: 100;
        MouseArea{
            anchors.fill: parent
        }
    }
}

main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("backend", &backend);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

и допусти mainwindow.h
#include "QObject"
#include "QString"

class Backend: public QObject{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
public:
    void change();
};

как в фале mainwindow.cpp привязать функцию change к нажатию по прямоугольнику и при этом менять его цвет?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Zifix
@Zifix Куратор тега Qt
Barbatum
1. В реальном коде не используйте абсолютное позиционирование, кроме редких случаев
2. У вас сейчас MouseArea имеет нулевой размер, надо использовать anchors.fill: parent
3. В обработчике onClicked: backend.a вы сделали полную бессмыслицу, во-первых у бэкэнда нет такого свойства, во-вторых, вы его никак не изменили, и даже на экран не вывели.
4. Для того, чтобы методы С++ класса стали доступны в QML, они должны быть в секции public slots

В данном случае можно было бы добавить в бэкэнд свойство color, и его привязать к Rectangle, как color: backend.color. Ну и в onClicked уже вызывать backend.change(), которая обновит свойство.

А вообще, читайте статьи, книгу, чужие исходники, и документацию, чтобы не возникало подобных элементарных вопросов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы