1

我正在开发一个时钟应用程序,我需要使用 Q_PROPERTY 来完成它。这个想法是使用 C++ 制作所有时钟控制逻辑并将其部署在 QML GUI 中。我在 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
    }
}

正如您所看到的,这是一个简短而简单的代码,当我尝试引用 C++ 公开的属性时,问题出在 QML 中,我添加了几个控制台以便在日志中查看结果,它就像一个魅力windows,我从来没有得到这些“未定义的文本”,但在带有 linux 发行版的开发板上,我有时会得到:

qml:QcppClock(0×7e8eeca8)1 49 qml:QcppClock(0×7e8eeca8)未定义未定义qml:QcppClock(0×7e8eeca8)1 49

第一个调试是 C++ 中 c++ 公开对象的地址,然后是 Q_PROPERTY“小时”和 Q_PROPERTY“分钟”。

先感谢您。

拉姆塞斯

4

0 回答 0