【发布时间】:2022-11-08 10:34:23
【问题描述】:
我有一个包含这么多字段的 cpp 结构
struct CloudMusicSongList{ ... };
我想在 qml 中使用它,以便向它的实例输入一些信息,但我不想创建一个 qobject 派生类,并创建很多 qproperty ... 我在谷歌搜索并从blog 获取此代码片段
class ListItem : public QObject
{
Q_OBJECT
public :
ListItem(QObject *parent = 0) : QObject(parent) {}
virtual ~ListItem() {}
virtual int id() const = 0;
virtual QVariant data(int role) const = 0;
virtual QHash<int, QByteArray> roleNames() const = 0;
virtual void triggerItemUpdate() {emit dataChanged();}
signals:
void dataChanged();
};
我只是尝试以下代码但甚至不打印called data method
定义的.h
template <typename T>
class bindingProxy : public bindingProxyBase
{
public:
bindingProxy(QObject* parent = 0)
: bindingProxyBase(parent)
{
}
T tm;
virtual ~bindingProxy()
{
}
virtual QVariant data(int role)
{
qDebug() << "called data method";
QVariant qv;
auto fucs = Prism::Reflection::get_md<T>();
if (role == Qt::DisplayRole)
fucs[0].getFunc(tm, 0, qv);
else
fucs[role].getFunc(tm, role, qv);
return qv;
}
QHash<int, QByteArray> roleNames() const
{
static QHash<int, QByteArray> roles{};
if (roles.count() == 0)
{
for (Prism::Reflection::PrismMetaData<T>& item : Prism::Reflection::get_md<T>())
{
roles[item.offset] = item.name;
}
}
return roles;
}
bool setData(QVariant& value, int role = Qt::EditRole)
{
Prism::Reflection::get_md<T>()[role].setFunc(tm, role, value);
triggerItemUpdate();
return true;
}
};
bodyViewModel.cpp
#include ....
...
..
Q_DECLARE_METATYPE(bindingProxy<CloudMusicSongList>*);
class BodyViewModel : public QObject
{
Q_PROPERTY(bindingProxy<CloudMusicSongList>* editSongListModel READ editSongListModel WRITE setEditSongListModel NOTIFY editSongListModelChanged)
...
...
...
使用.qml
Button {
id:btn_tst
text: BodyViewModelCpp.editSongListModel.name + "hbb"
onClicked: BodyViewModelCpp.editSongListModel.name = "3232"
}
运行应用程序梯级后按钮看起来像这个图像
不知道是不是XY问题。
有人可以帮忙吗?谢谢
我想创建一个 bindingProxy 模板类,它可以在 qml 中双向绑定 我认为它应该等同于 wpf 中的dynamicObject
【问题讨论】:
-
如果你不想要 Q_OBJECT,你考虑过 Q_GADGET 吗?
-
不,我想使用纯 C++ 结构,没有宏
-
但是 Q_GADGET 允许您向 QML 公开一个 c++ 结构。