Qt Quick - как использовать класс C++, унаследованный от QQuickPaintedItem, в интерфейсе qml?
Я новичок в Qt 5.13.0. В проекте Visual Studio 2019 мне нужно отобразить пользовательский нарисованный элемент, унаследованный от класса QQuickPaintedItem, в интерфейсе qml. Настраиваемый элемент написан в классе C++ с именем WQTMessageItem, который объявлен следующим образом:
class WQTMessageItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(bool rightAligned READ isRightAligned WRITE setRightAligned NOTIFY rightAlignedChanged)
signals:
void rightAlignedChanged();
public:
WQTMessageItem(QQuickItem* parent = 0);
void paint(QPainter* painter);
bool isRightAligned();
void setRightAligned(bool rightAligned);
private:
bool m_RightAligned;
};
На стороне C++ я пытаюсь объявить вышеуказанный класс движку qml следующим образом:
QQmlContext* pContext = engine.rootContext();
std::unique_ptr<WQTMessageItem> pMessageItem(new WQTMessageItem());
pContext->setContextProperty("WQTMessageItem", pMessageItem.get());
pMessageItem.release();
И, наконец, я пытаюсь использовать указанный выше настраиваемый элемент в ListView, объявленном в файле qml, следующим образом:
ListView
{
anchors.bottom: controls.top
anchors.bottomMargin: 2
anchors.top: parent.top
id: balloonView
delegate: WQTMessageItem
{
anchors.right: index % 2 == 0 ? undefined : parent.right
height: 60
rightAligned: index % 2 == 0 ? false : true
width: balloonWidth
}
model: balloonModel
spacing: 5
width: parent.width
}
К сожалению, это не работает. Мое приложение компилируется и связывается, но сразу же закрывается при запуске со следующим сообщением об ошибке:
QQmlApplicationEngine failed to load component
qrc:/main.qml:33 WQTMessageItem is not a type
Я безуспешно пытался найти решение самостоятельно. Может ли кто-нибудь объяснить мне, как мне изменить приведенный выше код, чтобы он работал?
1 ответ
Вам необходимо зарегистрировать тип C++ в системе QML с помощью функции qmlRegisterType.
Пример можно найти здесь.
Метод setContextProperty предназначен для экспорта значения (не типа) из C++ в QML.