Qt Quick - 如何在 qml 界面中使用继承自 QQuickPaintedItem 的 c++ class?
Qt Quick - How to use a c++ class inheriting from QQuickPaintedItem in a qml interface?
我是 Qt 5.13.0 的新手。在一个 Visual Studio 2019 项目中,我需要在 qml 界面中显示一个继承自 QQuickPaintedItem class 的自定义绘制项。自定义项是用c++ class编写的,名为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 引擎声明上述 class:
QQmlContext* pContext = engine.rootContext();
std::unique_ptr<WQTMessageItem> pMessageItem(new WQTMessageItem());
pContext->setContextProperty("WQTMessageItem", pMessageItem.get());
pMessageItem.release();
最后,我尝试在 qml 文件中声明的 ListView 中使用上述自定义项,方法如下:
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
我试图自己寻找解决方案,但没有成功。有人可以解释我应该如何修改上面的代码以使其工作吗?
您必须使用 qmlRegisterType function.
An example may be found here.
在 QML 系统中注册 C++ 类型
setContextProperty 方法旨在将值(不是类型)从 C++ 导出到 QML。
我是 Qt 5.13.0 的新手。在一个 Visual Studio 2019 项目中,我需要在 qml 界面中显示一个继承自 QQuickPaintedItem class 的自定义绘制项。自定义项是用c++ class编写的,名为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 引擎声明上述 class:
QQmlContext* pContext = engine.rootContext();
std::unique_ptr<WQTMessageItem> pMessageItem(new WQTMessageItem());
pContext->setContextProperty("WQTMessageItem", pMessageItem.get());
pMessageItem.release();
最后,我尝试在 qml 文件中声明的 ListView 中使用上述自定义项,方法如下:
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
我试图自己寻找解决方案,但没有成功。有人可以解释我应该如何修改上面的代码以使其工作吗?
您必须使用 qmlRegisterType function.
An example may be found here.
setContextProperty 方法旨在将值(不是类型)从 C++ 导出到 QML。