[발번역] Data Type Conversion Between QML and C++
Qt 2016. 1. 22. 12:22원문링크 : http://doc.qt.io/qt-5/qtqml-cppintegration-data.html
QML와 C 사이의 데이터 변환 형식
데이터 값이 QML 및 C를 교환 할 때, 이것은 인식 엔진 형으로 통신을 요구하거나 QML C.에 사용하기 적합한 올바른 데이터 형식을 가지고 엔진 QML에 변환된다.
QML 엔진은 또한 데이터 유형 Qt는 C의 많은 수에 대한 기본 지원을 제공하고, C는 QML로 시스템에 등록 할 수있는 사용자 정의 형은 엔진이를 사용할 수 있습니다.
이 페이지는, 엔진 QML 그들이 어떻게 QML 및 C 사이에 변환한다 지원 데이터 유형을 설명
부동산 정보
객체의 소유가 아닌 경우,이 경우에는 엔진 QML는, 오브젝트의 소유권을 가정하면 QML로 C에서 데이터를 전송할 때, 데이터를 소유 항상 QObject를 통화와 명시적인 방법에서 반환 된 경우는 예외이다 C.로 남아 명시 적으로 QQmlEngine :: setObject를 속성 () QQmlEngine :: CPP와이 속성을 지정의 원인, C로 유지하기 위해 설정합니다.
또한, 엔진 QML 정상 부모 QObject를 소유권의 의미를 존중 이미 부모가 예를 QObject를 책임을지지 않습니다 언젠가 Qt는 C는 객체합니다.
기본 Qt는 데이터 유형
기본적으로, QML은 다음과 같은 데이터 QML로 C에서 전달 될 때 자동으로 적절한 QML 기본 타입으로 변환됩니다 유형 Qt는, 그 반대의 경우도 마찬가지 인식 :
|
참고 : 클래스는 모듈이 Qt는 빠른의 일부입니다 QColor, QFont, QQuaternion 및 QMatrix4x4 만 사용할 수 QML, 같은 모듈 Qt는 GUI를 제공.
편의를 위해, 이러한 종류의 많은 QML 문자열 값에 지정되거나 QtQml 제공된 적절한 방식 Qt는 개체 ::. 예를 들어, 이미지의 속성 (자동 QSize 형 변환) 및 포맷 된 문자열 값 "WIDTHxHEIGHT"로 정의 할 수 있습니다, 또는 Qt.size () 함수 크기 : sourceSize 유형이있다 :
Item { Image { sourceSize: "100x200" } Image { sourceSize: Qt.size(100, 200) } }
자세한 내용은 QML Basic Types에 따라 각 유형에 대한 설명서를 참조하십시오.
QObject를 파생 유형
상관 QObject를 파생 클래스는 클래스 QML 유형에 기록되어 제공 QML와 C 사이의 데이터 교환을위한 입력으로서 사용될 수있다.
엔진은 인스턴스 및 비 인스턴스화 유형 모두의 등록을 할 수 있습니다. 클래스 QML의 형태로 등록 된 후에는 등록 유형에 대한 추가 정보의 QML QML 및 C 형 레지스터 참조와 C 형 사이의 데이터 교환을위한 데이터 형식으로 사용될 수있다.
Qt와 자바 스크립트 타입 간의 변환
QML 엔진은 자바 스크립트의 관련 타입 Qt는 종류의 수를 변환하기위한 지지체를 내장하고 QML 및 C.간에 데이터를 전송할 때 반대로,이 이러한 유형의 사용을 허용하고 값에 대한 액세스를 제공하는 사용자 정의 유형의 구현에 대한 필요성없이 C 또는 JavaScript에 갖다했다 데이터 및 속성.
(환경이 자신의 개체에 QML 자바 스크립트를 변경 추가 기능을 제공하는 문자열, 날짜와 숫자를 포함하여 자바 스크립트, 프로토 타입합니다. 자세한 내용은JavaScript Host Environment를 참조하십시오.)
QVariantList 및 QVariantMap 배열, 그리고 자바 스크립트 객체
QML 엔진은 QVariantList과 자바 스크립트 배열 사이의 자동 형 변환을 제공하며, QVariantMap과 자바 스크립트 객체 사이.
예를 들어, 바닥에 정의 된 함수는 QML 두 개의 인자, 어레이 객체를 기대하고 표준 자바 스크립트 구문 어레이 및 개체 액세스 포인트를 사용하여 그 내용을 표시 떠났다. 바로 아래의 코드가 자동으로 repectively 자바 스크립트의 배열과 객체 값으로 변환됩니다 QVariantList과 QVariantMap 전달이 함수를 호출로 :
QML | // MyItem.qml Item { function readValues(anArray, anObject) { for (var i=0; i<anArray.length; i++) console.log("Array item:", anArray[i]) for (var prop in anObject) { console.log("Object item:", prop, "=", anObject[prop]) } } } |
C++ | // C++ QQuickView view(QUrl::fromLocalFile("MyItem.qml")); QVariantList list; list << 10 << QColor(Qt::green) << "bottles"; QVariantMap map; map.insert("language", "QML"); map.insert("released", QDate(2010, 9, 21)); QMetaObject::invokeMethod(view.rootObject(), "readValues", Q_ARG(QVariant, QVariant::fromValue(list)), Q_ARG(QVariant, QVariant::fromValue(map))); |
이는 출력으로서 생산 :
Array item: 10 Array item: #00ff00 Array item: bottles Object item: language = QML Object item: released = Tue Sep 21 2010 00:00:00 GMT+1000 (EST)
이 C로 전송 할 때 C를 입력하거나 속성 또는 메서드 매개 변수 값의 유형에 대한 QVariantList QVariantMap 유형을 사용하는 경우 마찬가지로, QML에서 자바 스크립트 배열 또는 객체의 형태로 생성 할 수 있으며, 자동, QVariantList 또는 QVariantMap로 변환
날짜에 QDateTime 자바 스크립트
QML 엔진은 값 QDateTime 및 JavaScript Date 객체 사이의 자동 형 변환을 제공합니다.
예를 들어, QML 바닥에 정의 된 함수는 등록이 자바 스크립트 객체 기대, 현재 날짜와 시간 새 Date 객체를 반환 떠났다. 이 함수 readDate로 전송 될 때 자동으로 현재까지 엔진을 변환 된 값을 전달 QDateTime 오른쪽 아래의 호출 부호이 기능과 (). 차례로, readDate ()는 자신이 C에서받을 때 자동으로 값 QDateTime로 변환되는 개체 날짜를 반환합니다 :
// MyItem.qml Item { function readDate(dt) { console.log("The given date is:", dt.toUTCString()); return new Date(); } } |
// C++ QQuickView view(QUrl::fromLocalFile("MyItem.qml")); QDateTime dateTime = QDateTime::currentDateTime(); QDateTime retValue; QMetaObject::invokeMethod(view.rootObject(), "readDate", Q_RETURN_ARG(QVariant, retValue), Q_ARG(QVariant, QVariant::fromValue(dateTime))); qDebug() << "Value returned from readDate():" << retValue; |
마찬가지로, C는 QML에서 JavaScript Date 객체로 생성 될 수 속성 또는 방법 파라미터 값의 유형 QDateTime를 사용하고,이 C로 전달 될 때 자동적 값 QDateTime로 변환하여 입력하면,
자바 스크립트 배열 순서 유형
배열 자바 스크립트의 유형으로 QML에서 지원 투명도와 시퀀스의 일부 유형.
특히, 현재 QML을 지원합니다 :
QList<int>
QList<qreal>
QList<bool>
QList<QString>
and QStringList
QList<QUrl>
시퀀스의 이러한 유형은 서열이 QML 노출 될 수있는 두 가지 방법이 있습니다 C의 기본 순서의 관점에서 직접 구현 : Q_PROPERTY 방법이 유형의 순서; 또는 반환 형식의 Q_INVOKABLE 방법으로. 그들이 구현하는 방법에 약간의 차이가 있습니다,주의하는 것이 중요하다.
서열 Q_PROPERTY로 노출되는 경우, 인덱스 시퀀스에서 임의의 값에 대한 액세스 권한이있는 QObject의 테이트, 오히려 그 후에 발생하는 판독로부터 판독 된 시퀀스 데이터를 일으킬 것이다. 마찬가지로, 값 시퀀스의 변화는 시퀀스 데이터를 읽은 후 변경 사항이 구현 될 것이며, 수정 순서가 다시 QObject를의 속성에 기록됩니다 원인이됩니다.
순서가 Q_INVOKABLE 기능, 액세스 및 돌연변이에서 반환하는 경우 속성은 읽기 또는 쓰기 위하여려고하고 있지 아니 QObject를이 없기 때문에, 훨씬 저렴; 대신에, 시퀀스 데이터 및 C는 직접 변경 액세스했습니다.
투명성을 지원하지 않으며, 대신에 카피 시퀀스의 다른 타입으로 불투명 QVariantList QML 및 C 사이에 전송되는 다른 유형의 시퀀스.
중요 사항 : 서열 유형 어레이의 의미론 간의 약간의 차이, 및 기본 자바 스크립트 배열 형이 있다는 구현 형 C 스토리지의 사용. 특히, 값을 기본값으로 배열의 요소의 제거는 항목이 아닌 null 값을 교체 내장되어 있습니다. 마찬가지로, 현재의 값이 디폴트 값, 요소, 및 불확실한없는 요소에 의해 지정된 길이로 보충 시간의 배열이 발생할 것보다 큰 양에 의해 배열의 길이를 설정한다. 마지막으로, Qt는 컨테이너 클래스에 대한 지원 (그러나 서명하지) 정수 인덱스 서명; 따라서, INT_MAX보다 인덱스에 액세스 할 이상을하지 얻으려고.
다음과 같은 디폴트 값은 시퀀스의 각 유형에 대해 구축된다 :
QList<int> | integer value 0 |
QList<qreal> | real value 0.0 |
QList<bool> | boolean value false |
QList<QString> and QStringList | empty QString |
QList<QUrl> | empty QUrl |
당신이 사용하는 대신 스플 라이스를 순서대로 항목을 제거하기보다는 단순히 내장 된 기본 값으로 대체, 인덱스 delete 연산자 ( "시퀀스 삭제 [I]"를) 사용하지 않지만하려면 ( "sequence.splice (시작 인덱스, deleteCount에 ) ").
값 유형
C의 API와 동일한 특성 및 기능을 가진 객체의 QPoint 자바 스크립트로 표현 Qt는 등의 다른 유형의 값. 같은보기는 값으로 사용자 정의 형식 가능합니다. 엔진 QML과 사용자 정의 형식의 값을 사용하려면, 클래스 선언은 Q_GADGET로 주석해야합니다. 의도 된 특성은 Q_PROPERTY으로 선언해야합니다 자바 스크립트 프리젠 테이션에서 볼 수 있습니다. 마찬가지로, 함수는 Q_INVOKABLE을 표시해야합니다. 그것은 QObject를 C의 API에 대하여, 동일하다. 예를 들어, Actor 클래스는 장치로 아래 주석과 다음과 같은 속성이 있습니다 :
목록 유형
데이터 형식으로 목록을 사용하려면, 메타 오브젝트 시스템 Qt를 등록하려면) 클래스를 등록해야합니다 및 전송은 Q_ENUMS을 (선언해야합니다. 예를 들어, 클래스 다음과 같은 메시지가 상태를 나열한다 :
class Message : public QObject { Q_OBJECT Q_ENUMS(Status) Q_PROPERTY(Status status READ status NOTIFY statusChanged) public: enum Status { Ready, Loading, Error }; Status status() const; signals: void statusChanged(); };
메시지 클래스는 QML 같은 시스템에 등록되어 제공, 상태 전송은 QML로 사용될 수있다 :
Message { onStatusChanged: { if (status == Message.Ready) console.log("Message is loaded!") } }
참고 : 열거 값의 이름은 QML에서 액세스 할 수하기 위해, 문자로 시작해야합니다.
신호와 메서드 매개 변수로 나열 유형
파라미터 전송 유형 QML 함께 사용할 수있는 신호 C 및 방법은 제공되는 신호와 방법 또는 클래스 또는 Qt를 선언 그 이름 중 하나 열거 선언 값 모두의 전송.
파라미터 전송 C 신호는 연결 () 함수를 사용하여 QML에 연결해야하는 경우 또한, 전송의 타입이 qRegisterMetaType 통해 등록 할 ().
신호 QML를 들어, 열거 형 값은 유형 INT를 사용하여 파라미터 신호로 전달 될 수있다 :
Message { signal someOtherSignal(int statusValue) Component.onCompleted: { someOtherSignal(Message.Loading) } }
'Qt' 카테고리의 다른 글
Exposing Attributes of C++ Types to QML (0) | 2017.06.10 |
---|---|
Intergrating QML and C++ (0) | 2017.06.10 |
[발번역] Performance Considerations And Suggestions (0) | 2017.05.15 |
[발번역] QML Canvas Element (0) | 2017.02.22 |
QtCreator 실행 시 libHelp.so 파일 없음 경고 해결 (0) | 2016.07.25 |