Q_PROPERTY не работает должным образом в дистрибутиве Linux

Я занимаюсь разработкой приложения для часов, и мне нужно сделать это с помощью Q_PROPERTY. Идея состоит в том, чтобы сделать всю логику управления часами с помощью C++ и развернуть ее в графическом интерфейсе QML. У меня это работает на компьютере с Windows, но когда я запускаю его в дистрибутиве Linux на плате разработки, я получаю иногда неопределенный текст (которые являются открытыми свойствами C++).

Заголовочный файл:

#ifndef QCPPCLOCK_H
#define QCPPCLOCK_H

#include <QObject>
#include <QDebug>
#include <QString>
#include <QTime>
#ifdef __linux__
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#endif

class QcppClock : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString hours READ hours WRITE setHours NOTIFY hoursChanged)
    Q_PROPERTY(QString minutes READ minutes WRITE setMinutes NOTIFY minutesChanged)

private:
    QString actualHours;
    QString actualMinutes;
    QObject* rootObject;
    QTime actualTime;
    qint8 alarmHour;
    qint8 alarmMinutes;
    QString timeFormat;
    bool alarmSet;
#ifdef __linux__
    struct tm* ptm;
    struct timeval tv;
#endif

public:
    explicit QcppClock(QObject *parent = 0);
    QString hours();
    void setHours(QString);
    QString minutes();
    void setMinutes(QString);

public slots:
    void qcppClock_vUpdateTextTime_slot(void);

signals:
    void qcppClock_vTriggerAlarm_signal(void);
    void hoursChanged(void);
    void minutesChanged(void);
};

#endif // QCPPCLOCK_H

Файл.cpp:

#include "qcppclock.h"
#include <QTimer>
#include <QtCore/qmath.h>

QcppClock::QcppClock(QObject *parent) :
    QObject(parent)
{
    QTimer* timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(qcppClock_vUpdateTextTime_slot()));
    rootObject = parent;
    actualTime = QTime::currentTime();
    /* Initialize the format to 24 hours */
    timeFormat = "24hours";
    timer->start(1000);
#ifdef __linux__
    gettimeofday (&tv, NULL);
    ptm = localtime (&tv.tv_sec);
    int hour = ptm->tm_hour;
    //setHours(hour);
    //actualHours = QString::number(hour);
    int minutes = ptm->tm_min;
    //setMinutes(minutes);
    //actualMinutes = QString::number(minutes);
    int seconds = ptm->tm_sec;
    (void)actualTime.setHMS(hour , minutes, seconds);
#endif

}

QString QcppClock::hours()
{
    return actualHours;
}

void QcppClock::setHours(QString newHours)
{
    actualHours = newHours;
#ifdef __linux__
    tv.tv_sec += 3600 * actualHours.toInt();
    settimeofday(&tv, NULL);
#else
    (void)actualTime.setHMS(actualHours.toInt() , actualMinutes.toInt(), actualTime.second());
#endif
    emit hoursChanged();
}

QString QcppClock::minutes()
{
    return actualMinutes;
}

void QcppClock::setMinutes(QString newMinutes)
{
    actualMinutes = newMinutes;
#ifdef __linux__
    tv.tv_sec += 60 * actualMinutes.toInt();
    settimeofday(&tv, NULL);
#else
    (void)actualTime.setHMS(actualHours.toInt() , actualMinutes.toInt(), actualTime.second());
#endif
    emit minutesChanged();
}

void QcppClock::qcppClock_vUpdateTextTime_slot(void)
{
    actualTime = actualTime.addSecs(1);
    actualMinutes = QString::number(actualTime.minute());
    emit minutesChanged();
    actualHours = QString::number(actualTime.hour());
    emit hoursChanged();
    QString::number(actualTime.minute());
}

Основной файл, который создает экземпляр объекта clockctrl:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "qcpp_Clock/qcppclock.h"

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

    QQmlApplicationEngine engine;
    QcppClock qcpp_Clock;
    QQmlContext* context = engine.rootContext();
    context->setContextProperty("clockCtrl", &qcpp_Clock);
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

И файл QML, использующий открытые свойства:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    visible: true
    width: 800
    height: 480

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

    Text {
        property string prHours: clockCtrl.hours
        property string prMinutes: clockCtrl.minutes
        text: {
            console.log(clockCtrl, clockCtrl.hours, clockCtrl.minutes);
            return (prHours + " : " + prMinutes)
        }
        anchors.centerIn: parent
    }
}

Как вы можете видеть, это короткий и простой код, проблема в QML, когда я пытаюсь сделать ссылку на открытые свойства C++, я добавил пару консолей, чтобы увидеть результат в журнале, и он работает как чудо в Windows, я никогда не получаю этот "неопределенный текст", но на плате разработки с дистрибутивом Linux я иногда получаю:

qml: QcppClock (0 × 7e8eeca8) 1 49 qml: QcppClock (0 × 7e8eeca8) undefined undefined qml: QcppClock (0 × 7e8eeca8) 1 49

Первой отладкой является адрес открытого в C++ объекта в C++, затем Q_PROPERTY "час" и Q_PROPERTY "минуты".

Заранее спасибо.

Рамзес

0 ответов

Другие вопросы по тегам