꿈꾸는 시스템 디자이너

QQuickWidget 사용법 본문

Development/Qt

QQuickWidget 사용법

독행소년 2015. 11. 26. 23:05

QQuickWidget은 QT에서 제공하는 QWidget 중 하나로 QQuickWidget을 Qt Quick를 담아 표현하는 QWidget이라 할 수 있다.

Qt 문서에 따르면, Qt Quick란 QML 어플리케이션을 작성하는 표준 라이브러리로, 쉽게 풀이하면 QML 문서로 작성된 컴포넌트가 Qt Quick라 할 수 있겠다.

Qt Quick를 실행시키고 화면에 출력하기 위한 방법은 다양한데, 그 중 하나가 QQuickWidget에 담아서 출력하는 것이다.

 

 

 

 

 QQuckWidgetTest.zip

 

위의 그림과 같이 하나의 QWidget에 세개의 버튼을 배치하고 버튼을 클릭할 때마다 해당 QQuickWidget을 출력한다. 이때 각 QQuickWidget 마다 고유의 QML 파일을 가진다.

 

<qquick1.qml> 

 import QtQuick 2.0


Rectangle {
    width: 360
    height: 270
    color: "#e3b3b3"

    Text {
        text: qsTr("QQuickQML1")
        textFormat: Text.AutoText
        style: Text.Normal
        font.bold: true
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
        anchors.fill: parent
        font.pixelSize: 15
    }
}

 

QQuickWidget에 담겨 화면에 표시될 Quick를 기술하는 QML 파일(QQuick1.qml)은 위와 같다. QQuick2.qml과 QQuick3.qml도 동일한 구조를 가진다.

 

 <myqquickwidget.h>

 #ifndef MYQQUICKWIDGET_H

#define MYQQUICKWIDGET_H

#include <QQuickWidget>
#include <QtCore/QtCore>
#include <QDebug>

class MyQQuickWidget : public QQuickWidget
{
    Q_OBJECT
public:
    // QQuickWidget을 상속하는 경우 생성자의 아규먼트를 QObject에서 QWidget으로 변경해준다.
    // parent를 아규먼트로 포함하면서 추가적인 아규먼트를 받고자 할경우 parent 아규먼트가 제일 뒤에
    // 오도록 정의한다.
    MyQQuickWidget(QString source, QWidget *parent = 0);

private:
    QString m_source;

signals:

public slots:
};

#endif // MYQQUICKWIDGET_H

 

Quick를 담아 표현할 QQuickWidget의 헤더파일은 위와 같다. QQuickWidget을 상속하는 클래스를 구현한 것으로 생성자의 아규먼트로 QObject가 아닌 QWidget을 받아야 하는 것에 주의해야 한다.

 

<myqquickwidget.cpp> 

#include "myqquickwidget.h"


// QQuickWidget을 상속하는 경우 생성자의 아규먼트를 QObject에서 QWidget으로 변경해준다.
// parent를 아규먼트로 포함하면서 추가적인 아규먼트를 받고자 할경우 parent 아규먼트가 제일 뒤에
// 오도록 정의한다.
// 아규먼트를 변수에 저장하고자 할경우 m_변수(아규먼트) 형식으로 정의하면 바로 대입된다.
MyQQuickWidget::MyQQuickWidget(QString source, QWidget *parent)
    : m_source(source), QQuickWidget(parent)
{
    qDebug() << m_source;
    this->setSource(m_source); //QML 파일의 경로
    this->setGeometry(120,10,360,270);

    this->show();
} 

 

CPP 파일의 구조는 위와 같다. m_source는 Quick으로 표현할 QML파일의 경로를 의미한다.

 

 <mainwidget.h>

 #ifndef MAINQWIDGET_H

#define MAINQWIDGET_H

#include <QWidget>
#include <QQuickWidget>
#include <myqquickwidget.h>

namespace Ui {
class MainQWidget;
}

class MainQWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainQWidget(QWidget *parent = 0);
    ~MainQWidget();

private slots:

    // QQuickWidget 선택을 받는 슬롯
     void on_pbQuick1_clicked();
    void on_pbQuick2_clicked();
    void on_pbQuick3_clicked();

private:
    Ui::MainQWidget *ui;

    int quickIndex;
    MyQQuickWidget *m_quickWidget1;
    MyQQuickWidget *m_quickWidget2;
    MyQQuickWidget *m_quickWidget3;

    void hideAllQQuickWidgets();
    void showQQuickWidget(int index);
};

#endif // MAINQWIDGET_H

 

<mainqwidget.cpp>

 #include "mainqwidget.h"

#include "ui_mainqwidget.h"

MainQWidget::MainQWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainQWidget)
{
    ui->setupUi(this);
    m_quickWidget1 = new MyQQuickWidget("qrc:/QQuick1.qml",this);
    m_quickWidget2 = new MyQQuickWidget("qrc:/QQuick2.qml",this);
    m_quickWidget3 = new MyQQuickWidget("qrc:/QQuick3.qml",this);

    hideAllQQuickWidgets();
    showQQuickWidget(1);
}

MainQWidget::~MainQWidget()
{
    delete ui;
}

void MainQWidget::on_pbQuick1_clicked()
{
    showQQuickWidget(1);
}

void MainQWidget::on_pbQuick2_clicked()
{
    showQQuickWidget(2);
}

void MainQWidget::on_pbQuick3_clicked()
{
    showQQuickWidget(3);
}

void MainQWidget::hideAllQQuickWidgets()
{
    m_quickWidget1->hide();
    m_quickWidget2->hide();
    m_quickWidget3->hide();
}

void MainQWidget::showQQuickWidget(int index)
{
    switch(index){
    case 1:
        m_quickWidget1->show();
        m_quickWidget1->raise();
        break;
    case 2:
        m_quickWidget2->show();
        m_quickWidget2->raise();
        break;
    case 3:
        m_quickWidget3->show();
        m_quickWidget3->raise();
        break;
    }
}

 

위의 MainQWidget 클래스에서는 사용자의 버튼 선택을 받아 해당 QQuickWidget을 화면에 보여주는 기능을 수행한다.

 

 

Comments