QT5.3 Как я могу добавить свой Qobject в QQmlEngine и получить доступ к его свойствам через QML?

Я начинаю с QT5.3, точнее с QT вообще. Теперь я в основном хочу запрограммировать консольные приложения C/C++ и добавить внешний интерфейс.

Я создал быстрое приложение QT, и у меня возникли проблемы с взаимодействием внутреннего кода с интерфейсом.

Что у меня есть до сих пор:

Основной.qml:

import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 1.2

Window {
    visible: true
    width: 360
    height: 360

    MouseArea {
        anchors.fill: parent
        onClicked: {
          //  Qt.quit();
        }
    }

    Text {
        text: w1.getRoll
        anchors.centerIn: parent
    }

    Button {
        onClicked: w1.roll
    }


}

Main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "wuerfel.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    Wuerfel w1;

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
    engine.setContextForObject(&w1,engine.rootContext());

    return app.exec();
}

Wuerfel.h :

#ifndef WUERFEL_H
#define WUERFEL_H

#include <QObject>
#include <time.h>
#include <cstdlib>

class Wuerfel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString w1 READ getRoll WRITE roll NOTIFY rolled)
public:
    explicit Wuerfel(QObject *parent = 0);
    void roll(){
        srand((unsigned) time(NULL));
        head = rand() % 6 + 1;

        emit rolled();
    }

    int getRoll(){
        return head;
    }

signals:
    void rolled();

public slots:

private:
    int head;
};

#endif // WUERFEL_H

Ошибка отладки

Ошибка отладки

Я понятия не имею, что мне делать. Документация и результаты веб-поиска с похожими проблемами смущают меня еще больше. Они упоминают QQView или QComponent и т. д., но всякий раз, когда я пробую одно из их решений, чего-то не хватает. Как упомянутый метод не является частью объекта, поэтому он не найден и т.д.

Кто-нибудь знает, как заставить это работать? Я хочу использовать этот подход для визуализации будущих консольных приложений из учебника по C++. И разработка интерфейсов в QT в целом.

Заранее спасибо. знак равно


person ViGi    schedule 24.08.2014    source источник


Ответы (1)


Вы можете использовать QQmlContext::setContextProperty для установки значения свойства имени в корневом контексте:

engine.rootContext()->setContextProperty("w1",  &w1);
person Nejat    schedule 24.08.2014
comment
Ух ты, все ошибки исчезли, кроме одной: нет соответствующей функции для вызова 'Wuerfel::roll(QString&)' case 0: roll(*reinterpret_cast‹ QString*›(_v)); перемена; ^ - person ViGi; 24.08.2014
comment
@ViGi В объявлении вашего свойства указано WRITE roll, что означает, что ваш метод roll() должен быть установщиком. - person MrEricSir; 24.08.2014
comment
@MrEricSir Итак, мне нужно изменить roll () на roll (QString bla)? Сделал это, и теперь у меня есть кое-что, похожее на проблему с конструктором: неопределенная ссылка на `Wuerfel::Wuerfel(QObject*)', боже. Спасибо за помощь, ребята. Я вижу прогресс, но цель все еще не достигнута :( - person ViGi; 24.08.2014
comment
Хорошо, я удалил Конструктор, теперь окна по крайней мере всплывают ^^ Думаю, я попытаюсь разобраться в этом в одиночку. Значение не меняется и т.д. и пишет, что w1 не определен, но уф.. Спасибо, ребята, за беспокойство =) - person ViGi; 24.08.2014
comment
@ViGi roll должен иметь аргумент int. Должно быть как void roll(int value). Также вы не должны испускать rolled() там, потому что он будет испускаться автоматически, так как он определен как NOTIFY. - person Nejat; 24.08.2014
comment
@Все, Джей! Я работаю. Отсутствовала только часть: ссылка. это немецкий, я имею в виду часть соединений в qml, после этого у меня все пошло нормально. P.S. когда я удаляю emit rolled(), он ничего не делает, как будто сигнал не испускается, может быть, это не автоматически. Но еще раз спасибо за помощь, наконец-то положительный результат =) - person ViGi; 24.08.2014