QWidget-in-QML/ja

From Qt Wiki
Jump to navigation Jump to search
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

QML에서 QWidget 사용하기

이 샘플 코드는 Qt 5.3 + Qt Creator 3.1을 기반으로 쓰여짐

QML은 메타 오브젝트 시스템을 기반으로 하기 때문에 QObject를 상속받은 모든 오브젝트는 QML에 등록하여 사용 가능하다. 여기서는 기존의 QWidget을 QML로 제어하는 방법에 대해 설명한다.

기존 네이티브 코드

아래는 지극히 단순 평범한 QWidget코드이다.

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 QPushButton button;
 button.setText("Push Button in C+''");
 button.show();

 return a.exec();
}


QML에서 QWidget을 사용

위 예제를 이제부터 QML에서 제어 가능하도록 바꾸어 보겠다.

.pro 파일에서 qml 모듈을 추가시킨다.

QT''= core gui qml<code>

qrc 파일을 생성한다. 파일 이름은 qml로 하였다.
qml파일을 생성한다. 파일 이름은 main.qml로 하였다.
Qt Creator의 프로젝트 뷰에서 아래와 같은 계층 구조를 확인 가능하다.

Resources

qml.qrc
/
main.qml
main.qml파일을 아래와 같이 작성한다.

import QWidgets 1.0

QPushButton {

text: "Push Button in QML"

}

main.cpp를 아래와 같이 바꾼다.

#include <QApplication>

  1. include <QPushButton>
  2. include <QQmlEngine>
  3. include <QQmlComponent>
  4. include <qqml.h> // qmlRegisterType을 사용하기 위해 필요

int main(int argc, char argv[]) {

qmlRegisterType<QPushButton>("QWidgets", 1, 0, "QPushButton");
QApplication a(argc, argv);
QQmlEngine engine;
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));
QObject o = component.create();
QWidget* w = qobject_cast<QWidget*>(o);
w->show();

return a.exec();

}

실행해 보면 네이티브 코드와 똑같은 결과를 얻을  있다.

=== 코드 설명 ===

QPushButton을 QML에서 사용할  있도록 등록한다.

qmlRegisterType<QPushButton>("QWidgets", 1, 0, "QPushButton");

main.qml을 로드하여 컴포넌트를 생성한다.

 QQmlEngine engine;
 QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));

컴포넌트로부터 인스턴스를 생성한다.

 QObject* o = component.create();<code>

생성된 인스턴스를 QWidget으로 캐스팅하여 show메서드를 호출한다.

QWidget* w = qobject_cast<QWidget*>(o);

w->show();

소스참조: