Avatar
회사에서는
Todd

Cybertramp

아래에서 위로

QT Framework

글을 쓴날: 2020-09-01

Qt

Qt는 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크. Qt는 한번쓰고 여러 플랫폼용으로 컴파일하는것을 메인으로 개발된 프레임워크이다.

  • 현재 버전

    2020년 9월 기준 Qt 5.15와 Qt 4.11.1이 최신

  • License

    두가지 라이센스 방식이 존재

    1. Commercial License

      외부에 코드를 공개하지 않고도 독점적인 SW 개발 가능

      연간 구독요금이 $3950, UI 빌더 툴 별도(추가 연간 $999)

    2. 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에서 이 파일을 불러오는데 그 부분을 제거하면된다.

        image-20201021110001635

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