Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сигнал в QML
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Quick
Trisch
Как можно отправить сигнал из сласса написаного на C++ в QML?

Я, вот, пытылся сделать так:

// mainwindow.h

class MainWindow : public QQuickView {
    Q_OBJECT

public:
    MainWindow();
    QTimer *timer;

slots:
    void sTimer();

signals:
    void mainSignal(int t);
};

// mainwindow.cpp

MainWindow::MainWindow() {
    this->setSource(QUrl("qrc:/QML/main.qml"));

    this->timer = new QTimer();
    connect(this->timer, SIGNAL(timeout()), this, SLOT(sTimer()));
    this->timer->start(1000);
}

void MainWindow::sTimer() {
    emit mainSignal(1);
}

// main.qml

import QtQuick 2.0

Rectangle {
    width: 435
    height: 225

    onMainSignal: {
    }
}


В итоге выскакивала такая ошибка:
Cannot assign to non-existent property "onMainSignal"
Trisch
Я вот частично решил данную проблему, добавлением еще одного класса.
Теперь это выглядит примерно так:

// interfaceqml.h

class InterfaceQML : public QObject {
    Q_OBJECT
    
public:
    InterfaceQML(QObject *parent = 0);

    QTimer *timer;

signals:
    void newSignal();

public slots:
    void newSlot();
};

// interfaceqml.cpp

InterfaceQML::InterfaceQML(QObject *parent) : QObject(parent) {

    timer = new QTimer;
    connect(timer, SIGNAL(timeout()), this, SLOT(newSlot()));
    timer->start(500);
}


void InterfaceQML::newSlot() {
    emit newSignal();
}

// mainwindow.h

class MainWindow : public QObject {
    Q_OBJECT
public:
    MainWindow(QObject *parent = 0);
    InterfaceQML *interface;
    QQuickView *view;
};

// mainwindow.cpp

MainWindow::MainWindow(QObject *parent) : QObject(parent) {
    view = new QQuickView;

    qmlRegisterType<InterfaceQML>("Interface", 1, 0, "Interface");

    view->setSource(QUrl("file:/main.qml"));
    view->show();
}

// main.qml

import QtQuick 2.0
import Interface 1.0

Rectangle {
    width: 500
    height: 500
    color: "#748596"

    signal sgSignal()

    Text {
        id: text
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter

        text: "World"
        font.bold: true
        font.pointSize: 30
        color: "red"
    }

    Interface {
        onNewSignal: {
            text.text = "Hello World"
        }
    }
}


теперь по таймеру посылается сигнал в QML.

Но мне надо довать каманду на отсылку сигнала, как то из вне.

Тоесть можно отсылать сигнал по тому же таймеру, только из класса MainWindow. Примерно так

MainWindow::MainWindow(QObject *parent) : QObject(parent) {
    interface = new InterfaceQML;
    timer = new QTimer;
    view = new QQuickView;

    qmlRegisterType<InterfaceQML>("Interface", 1, 0, "Interface");

    view->setSource(QUrl("file:/main.qml"));
    view->show();
    QObject *pObject = view->rootObject();

    connect(timer, SIGNAL(timeout()), interface, SLOT(newSlot()));
    timer->start(500);
}


Вот так уже сигнал до QML не доходит(( Как это можно исправить?
Trisch
В общем один из вариантов решения. Использовать функцию T QObject::findChild ( const QString & name = QString() ) const

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.