반응형

https://gun-ny.tistory.com/46

전의 QQmlContext를 이용한 방법과 코드만 조금 다를뿐이지 차이점을 잘..... 모르겠다..

클래스를 라이브러리화 해도 cpp에서 include 해주느냐 qml에서 import 해주느냐 차이지

아직의 나로서는..ㅠ

아.. 클래스 자체를 qml 객체화 시킨다는 것도 차이점이면 차이점인가?

 

아무튼 코드상의 차이점을 확인하기 쉽게 전에 사용했던 코드는 주석처리 하였다.

참고 할 차이점은 cpp에서 include가 제외되고 qml에서 import가 추가 되었다는 점이다.

 


main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

//#include <QQmlContext>

#include "indicator.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

//    Indicator indicator;
//    engine.rootContext()->setContextProperty("Indicator", &indicator);

    qmlRegisterType<Indicator>("Indicator", 1, 0, "Indicator");

    engine.load(QUrl("qrc:/untitled/Main.qml"));

    return app.exec();
}

 

Main.qml

import QtQuick
import QtQuick.Controls

import Indicator 1.0

Window {
    width: 360
    height: 570
    visible: true
    title: qsTr("Gunny Arduino Control")

//    Connections {
//        target: Indicator
//        onLeftSignalSent: {
//            Indicator.getLeftIndicatorVisible(leftIndicator.visible);
//        }
//        onRightSignalSent: {
//            Indicator.getRightIndicatorVisible(rightIndicator.visible);
//        }
//    }

    Indicator {
        id: indicator
        onLeftSignalSent: {
            indicator.getLeftIndicatorVisible(leftIndicator.visible);
        }
        onRightSignalSent: {
            indicator.getRightIndicatorVisible(rightIndicator.visible);
        }
    }

    BusyIndicator {
        id: leftIndicator
        x: 40
        y: 15
        width: 100
        height: 100
        visible: true
    }

    BusyIndicator {
        id: rightIndicator
        x: 220
        y: 15
        width: 100
        height: 100
        visible: false;
    }

    Button {
        id: leftButton
        x: 5
        y: 140
        width: 170
        height: 300
        text: qsTr("좌측 깜빡이")
        onClicked: {
//            Indicator.sendLeftSignal();
            indicator.sendLeftSignal();
        }
    }

    Button {
        id: rightButton
        x: 185
        y: 140
        width: 170
        height: 300
        text: qsTr("우측 깜빡이")
        onClicked: {
//            Indicator.sendRightSignal();
            indicator.sendRightSignal();
        }
    }

    Button {
        id: hazardButton
        x: 5
        y: 450
        width: 350
        height: 100
        text: qsTr("비상등")
    }
}

 

indicator.h

#pragma once

#include <QObject>

#include <QDebug>

class Indicator : public QObject
{
    Q_OBJECT

public:
    Indicator(QObject *parent = nullptr);

signals:
    void leftSignalSent();
    void rightSignalSent();

public slots:
    void sendLeftSignal();
    void sendRightSignal();
    void getLeftIndicatorVisible(bool visible);
    void getRightIndicatorVisible(bool visible);

private:
    bool leftIndicatorVisible;
    bool rightIndicatorVisible;
};

 

indicator.cpp

#include "indicator.h"

Indicator::Indicator(QObject *parent) : QObject(parent)
{
}

void Indicator::sendLeftSignal()
{
    emit leftSignalSent();
}

void Indicator::sendRightSignal()
{
    emit rightSignalSent();
}

void Indicator::getLeftIndicatorVisible(bool visible)
{
    leftIndicatorVisible = visible;

    qDebug() << "LeftIndicatorVisible Value : " << leftIndicatorVisible;
}

void Indicator::getRightIndicatorVisible(bool visible)
{
    rightIndicatorVisible = visible;

    qDebug() << "RightIndicatorVisible Value : " << rightIndicatorVisible;
}

 

반응형
반응형

C++과 qml이 상호작용 하는 방법 중 하나인 setContextProperty 함수를 이용한 방법이다.

 

Button을 클릭(onClicked)하면 main.cpp에서 setContextProperty 함수로 등록한 Indicator 클래스의 슬롯 sendSignal이 호출되고 SendSignal에 정의되어 있던 SignalSent 시그널이 호출되어 qml에서 onSignalSent로 시그널을 감지하고 getIndicatorVisible 슬롯을 호출해서 Indicator qml 객체의 visible 속성 값을 Indicator C++ 클래스의 멤버변수로 받아오고 그 값을 디버그 창을 통해 출력하는 예이다.

 

C++과 qml이 상호작용 하는 방법은 여러가지가 있으나 대표적인 방법 2가지는

setContextProperty 함수를 이용한 방법과 qmlRegisgerType을 이용한 방법이 있다고 한다.

 

(왜 여러가지로 만드셨나요 다른건 이해하기 더 힘든거 같은데..)

 

https://gun-ny.tistory.com/47

qmlRegisterType을 이용한 방법도 겉핥기식으로 후딱 터득하고 바로 글을 써봤다.

 


main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QQmlContext>

#include "indicator.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    Indicator indicator;
    engine.rootContext()->setContextProperty("Indicator", &indicator);

    engine.load(QUrl("qrc:/untitled/Main.qml"));

    return app.exec();
}

 

Main.qml

import QtQuick
import QtQuick.Controls

Window {
    width: 360
    height: 570
    visible: true
    title: qsTr("Gunny Arduino Control")

    Connections {
        target: Indicator
        onLeftSignalSent: {
            Indicator.getLeftIndicatorVisible(leftIndicator.visible);
        }
        onRightSignalSent: {
            Indicator.getRightIndicatorVisible(rightIndicator.visible);
        }
    }

    BusyIndicator {
        id: leftIndicator
        x: 40
        y: 15
        width: 100
        height: 100
        visible: true
    }

    BusyIndicator {
        id: rightIndicator
        x: 220
        y: 15
        width: 100
        height: 100
        visible: false;
    }

    Button {
        id: leftButton
        x: 5
        y: 140
        width: 170
        height: 300
        text: qsTr("좌측 깜빡이")
        onClicked: {
            Indicator.sendLeftSignal();
        }
    }

    Button {
        id: rightButton
        x: 185
        y: 140
        width: 170
        height: 300
        text: qsTr("우측 깜빡이")
        onClicked: {
            Indicator.sendRightSignal();
        }
    }

    Button {
        id: hazardButton
        x: 5
        y: 450
        width: 350
        height: 100
        text: qsTr("비상등")
    }
}

 

indicator.h

#pragma once

#include <QObject>

#include <QDebug>

class Indicator : public QObject
{
    Q_OBJECT

public:
    Indicator(QObject *parent = nullptr);

signals:
    void leftSignalSent();
    void rightSignalSent();

public slots:
    void sendLeftSignal();
    void sendRightSignal();
    void getLeftIndicatorVisible(bool visible);
    void getRightIndicatorVisible(bool visible);

private:
    bool leftIndicatorVisible;
    bool rightIndicatorVisible;
};

 

indicator.cpp

#include "indicator.h"

Indicator::Indicator(QObject *parent) : QObject(parent)
{
}

void Indicator::sendLeftSignal()
{
    emit leftSignalSent();
}

void Indicator::sendRightSignal()
{
    emit rightSignalSent();
}

void Indicator::getLeftIndicatorVisible(bool visible)
{
    leftIndicatorVisible = visible;

    qDebug() << "LeftIndicatorVisible Value : " << leftIndicatorVisible;
}

void Indicator::getRightIndicatorVisible(bool visible)
{
    rightIndicatorVisible = visible;

    qDebug() << "RightIndicatorVisible Value : " << rightIndicatorVisible;
}
반응형
반응형

UI에 간단하게 Controls 객체 하나 띄워놓는거..

단순 모듈 하나 추가 하는걸로 반나절 이상을 날렸다................

 

구글 포풍 검색도 해보고

Chat GPT한테도 물어보고 Bard한테도 물어보고

MaintenanceTool도 몇번씩이나 돌려서 추가구성 설치 해보고

프로젝트 빌드 시스템을 qmake로도 만들어보고 CMake로도 만들어보고

 

오류 메시지도 그렇고 대부분 답변이 모듈 설치가 안되어 있다고 재설치 하라고 되어있다.

(QT 기본 모듈이고 설치가 되어 있으니까 내가 목록에서 클릭해서 추가 하지 않았을까?)

 

오기가 생겨서 Qt 폴더 하나하나 뒤적거리는 중 QtQuick 폴더 안에 Controls 폴더를 발견하게 된다.

 

어? 잠깐만

 

넌 왜 "5.15"가 붙어서 추가되냐?

 

빼본다.

 

해결 되었다.

 

하... 열 받는다...........

 

난 분명 컴포넌트 모듈 목록에서 "Controls"를 선택했고 Qt Creator에서 알아서 import 해줬고 그 경로가 "QtQuick.Controls 5.15"라고 자동으로 추가되어서 그런갑다 했는데 후........... 아무튼 해결.. 내 시간..

반응형

+ Recent posts