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.

Другие вопросы по тегам