2

QML は、 C++クラスQMLの両方との間で自由に変換できるように見えるdateを提供します。type はJS typeの拡張です。QDateDateDateDate

setプロパティでメソッドを呼び出すdateことは、エラー (「メソッドが見つかりません」など) がスローされないため、明らかに許可されています。

// in a QML object declaration
property date myDate: new Date()
// in a slot somewhere in the object
date.setYear(2002)

ただし、日付データは変更されませんsetYear呼び出し(またはその他の方法) の前後に日付を出力すると、setまったく同じ日付文字列が 2 回出力されます。

dateQML のドキュメントは、上記のリンクの型についてあまり言及していないようです。

4

2 に答える 2

1

dateこの方法で型を直接変更することはできないようです(そして air-dex の回答が確認しているようです) 。メソッドを呼び出そうとしてもエラーが発生しないため、これは奇妙です。

したがって、解決策は、後で変更する必要がある日付オブジェクトを単に宣言することvarですdate

于 2016-05-19T23:59:00.360 に答える
1

コメントされた次の例の何が問題なのかを説明しましょう。

クラス.hpp

#ifndef CLASS_HPP
#define CLASS_HPP

#include <QObject>
#include <QDateTime>

class DateCpp : public QObject
{
    Q_OBJECT
    public:
        DateCpp();

    protected:
        // QML dates are QDateTime in C++, not QDate.
        Q_PROPERTY(QDateTime fooDate
                   READ getDate
                   WRITE setDate
                   NOTIFY fooDateChanged)
        QDateTime date;
        QDateTime getDate() const;
        void setDate(const QDateTime & d);

    signals:
        void dateChanged();
};

#endif

クラス.cpp

#include "class.hpp"

DateCpp::DateCpp() : QObject(), date() {}

QDateTime DateCpp::getDate() const
{
    return this->date;
}

void DateCpp::setDate(const QDateTime & newDate)
{
    this->date = newDate;

    /*
     * You have to tell QML that the property value has changed.
     * For this, use the NOTIFY signal of the property. If you do not emit it,
     * the property will not by updated on the QML side.
     */
    emit fooDateChanged();
}

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "class.hpp"

int main(int argc, char ** argv)
{
    QApplication a(argc, argv);

    // Do not forget to declare your object to QML. ;-)
    qmlRegisterType<DateCpp>("Foobar", 3, 14, "DateQML");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return a.exec();
}

main.qml

import QtQuick 2.6
import Foobar 3.14

Rectangle {
    id: rect

    // A QML date (treated as a QDateTime by the engine).
    property date rectDate

    /*
     * Binded to myDate.fooDate, but variables are at different memory spaces.
     * Will be changed together nontheless.
     */
    property date rd2: myDate.fooDate

    /*
     * Just like rd2 but it is the same object in memory, a kind of pointer
     * on DateCpp::date.
     */
    property alias rd3: myDate.fooDate

    // No "=" but ":" for property declarations.
    property date aDateProp: Date.now()

    DateQML {
        id: myDate

        // It is a kind of slot connected to the fooDate Q_PROPERTY's NOTIFY signal.
        onFooDateChanged: {
            console.log("The foodate is: " + myDate.fooDate);

            // Will trigger a signal and "onRectDateChanged" will be executed.
            rect.rectDate = myDate.fooDate;
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            /*
             * It is JavaScript. "date d" is consequently wrong here.
             * d will be a QML date (treated as a QDateTime by the engine).
             */
            var d = Date.now();
            d.setYear(2002);

            // Calls the fooDate Q_PROPERTY's WRITE method, i.e. DateCpp::setDate();.
            myDate.fooDate = d;

            /*
             * If DateCpp::setDate(); is not called here, you can still copy 
             * the property to modify what you want:
             *
             * var d2 = myDate.fooDate;
             * d2.setYear(2025);
             * myDate.fooDate = d2;
             */
            myDate.fooDate.setYear(2025);
        }
    }

    onRectDateChanged: {
        console.log("The QML property has changed: " + rect.rectDate);
    }
}

TL;DR:

  • あなたはsを扱っていQDateTimeます。
  • NOTIFY シグナルを使用して、値が変更されたことをシステムに通知します。
  • date dJavaScript で日付を宣言することはできません。
  • =QML プロパティ宣言に" " はありませんが、" :" です。
于 2016-05-16T23:44:37.927 に答える