
QML에서 C++ 객체를 사용하려면?
- QT5 에서는
main.cpp의 main 함수에서 qmlRegister가 필요하다
...
qmlRegisterType<cpp 클래스명>("프로젝트명", 0, 1, "{QML에서 사용할 네임}");
qmlRegisterType<MessageProcessor>("Course", 0, 1, "MessageProcessor");
...
이후, 해당 cpp 파일을 쓸 qml파일에서
import {프로젝트명} {버전}을 통해 QML에서 cpp클래스에 정의된 함수를 사용할 수 있다.
import Course 0.1
Q_PROPERTY
Q_PROPERTY(Type name READ readFunction WRITE writeFunction NOTIFY notifySignal)
//Type: 속성(프로퍼티)의 데이터타입
//name: 속성의 이름
//READ: 속성 값을 읽는 함수
//WRITE: 속성 값을 설정하는 함수 (선택)
//NOTIFY: 속성 값이 변경될 때 발생하는 시그널 (선택)Q_PROPERTY(QString version READ version CONSTANT)
Q_PROPERTY(QString name MEMBER m_name NOTIFY nameChanged)
Q_INVOKABLE
QObject
QAbstractItemModel
QAbstractListModel
/* MyModel.h */
#pragma once
#include <QAbstractListModel>
class MyItem {
public:
QString name;
QString description;
};
class MyModel : public QAbstractListModel
{
Q_OBJECT
public:
enum ItemRoles {
NameRole = Qt::UserRole + 1,
DestiptionRole,
};
explicit MyModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
//데이터 추가 함수
Q_INVOKABLE void addItem(const QString &name, const QString &description);
protected:
QHash<int, QByteArray> roleNames() const override;
private:
QList<MyItem> m_items;
};
/* MyModel.cpp */
#include "mymodel.h"
MyModel::MyModel(QObject *parent)
: QAbstractListModel{parent}
{
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= m_items.count())
{
return QVariant();
}
const MyItem &item = m_items[index.row()];
switch(role) {
case NameRole:
return item.name;
case DestiptionRole:
return item.description;
default:
return QVariant();
}
}
int MyModel::rowCount(const QModelIndex &parent) const
{
return m_items.count();
}
void MyModel::addItem(const QString &name, const QString &description)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
MyItem item;
item.name = name;
item.description = description;
m_items << item;
endInsertRows();
}
// beginInsertRows(), endInsertRows() 사이에 있는 아이템에 변화가 생길 경우 UI가 업데이트됨
//RoleEnum 값과 매칭되는 name(qml에서 접근할) 매핑
QHash<int, QByteArray> MyModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[NameRole] = "name";
roles[DestiptionRole] = "description";
return roles;
}
/* main.qml */
MyModel {
id: myModel
}
ListView {
id: listView
anchors.fill: parent
model: myModel
ScrollBar.vertical: ScrollBar {
id: verticalScrollBar
width: 14
policy: ScrollBar.AlwaysOn
}
//List Item Preset
delegate: Item {
height: column.height + 10
Column {
id: column
Text {
text:model.name
font.bold: true
}
Text {
text:model.description
color: "lightpink"
}
}
}
Component.onCompleted: {
// 어플리케이션이 시작될 때 항목 추가
myModel.addItem("Item1", "This is the first item.")
for (var i = 0; i < 20; i++)
{
myModel.addItem("item" + i, "This is " +i+ " item.")
}
}
}