QT Framework
글을 쓴날: 2020-09-01
Qt
Qt는 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크. Qt는 한번쓰고 여러 플랫폼용으로 컴파일하는것을 메인으로 개발된 프레임워크이다.
-
현재 버전
2020년 9월 기준 Qt 5.15와 Qt 4.11.1이 최신
-
License
두가지 라이센스 방식이 존재
-
Commercial License
외부에 코드를 공개하지 않고도 독점적인 SW 개발 가능
연간 구독요금이 $3950, UI 빌더 툴 별도(추가 연간 $999)
-
GNU LGPL 버전 2.1
Qt 5.6(2016.03 Released) 까지까지 해당 라이센스였음
이후 버전 부터는 LGPL 3.0 -> 라이브러리 범위 소스코드 공개해야함(전체 코드는 아님)
-
-
언어
- C++, QML 언어 사용
-
사용 IDE
- Qt Creator 4.0.3
1. 기본구조
-
기본 프로젝트 생성
git을 사용하는 조건으로 Qt 5.6 버전으로 프로젝트를 생성하는 과정이다.
-
기본 생성 파일
기본적으로 프로젝트를 생성하면 다음의 파일들이 생성된다.
-
test2.pro
프로젝트 파일
-
deployment/deployment.pri
위의
*.pro
파일과 완전히 동일하며 Qt Project Include 파일이라고함. 공통적으로 필요한 환경을 이 파일에 설정하고*.pro
파일에 include 하여 사용 -
Sources/main.cpp
메인이 되는 cpp 파일
-
Resources/qml.qrc
-
main.qml
말그대로 기본 생성되는 window의 qml 파일
Sources/main.cpp
에서 해당 파일을 로드함 -
MainForm.ui.qml
이건 GUI 폼 파일인것 같은데 Dennis가 추천하지 않는 방식이라고함
따라서 이건 지우고 해도 무방.
main.qml
에서 이 파일을 불러오는데 그 부분을 제거하면된다.
-
-
2. 기본 버튼및 이벤트
버튼을 추가하고 그에 따른 이벤트를 실행시켜 본다.
-
1번 방법
이 방법은 slots을 사용하는 방법이다. 난 이 예제를 처음 봤기에 이걸 붙여 보았고 잘 동작한다.
Headers/globalobject.h
#ifndef GLOBALOBJECT_H #define GLOBALOBJECT_H #include <QObject> class GlobalObject : public QObject{ Q_OBJECT public: GlobalObject(); public slots: void doSomething(const QString &text); }; #endif // GLOBALOBJECT_H
Sources/globalobject.cpp
#include "globalobject.h" #include <QDebug> GlobalObject::GlobalObject() { // perform custom initialization steps here } void GlobalObject::doSomething(const QString &text) { qDebug() << "GlobalObject doSomething called with" << text; }
Sources/main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QObject> #include <QQmlContext> #include "globalobject.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; GlobalObject* globalObj = new GlobalObject(); globalObj->doSomething("TEXT FROM C++"); engine.rootContext()->setContextProperty("globalobject", globalObj); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
Resources/qml.qrc/main.qml
import QtQuick 2.6 import QtQuick.Window 2.2 Window { visible: true width: 640 height: 480 title: qsTr("Test") Rectangle { id: button width: 100 height: 30 color: "red" radius: 5 anchors.centerIn: parent Text { id: "buttonText" text: qsTr("Button") color: "white" anchors.centerIn: parent } MouseArea{ anchors.fill: parent onClicked: globalobject.doSomething("Pushed") } } }
위 예제는 버튼을 누르면 콘솔 창에 Pushed 라는 텍스트가 출력되는 단순한 예제이다. 예제 2개를 합친것이라서 조금 이상하다.
동작은 정상적으로 된다.
-
2번 방법
Dennis가 추천해준 예제에서 가져온 방법이다.
Q_PROPERTY 매크로 : QML Element 의 Property를 C++과 통신을 위한 기능
Q_INVOKABLE : QML 에서 C++ 함수를 호출하는 방법
comments powered by Disqus