找回密码
 立即注册
收起左侧

关于QML和C++交互的问题

8
回复
7766
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2015-5-25 15:15:36 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 beidaochuan 于 2015-6-7 16:30 编辑

我现在是写了以下的代码。

int main(int argc, char *argv[]){    QApplication app(argc, argv);    qmlRegisterType<A>("MyLib", 1, 0, "A");    qmlRegisterType<B>("IshidaLib", 1, 0, "B");    qmlRegisterType<C>("IshidaLib", 1, 0, "C");    QQmlApplicationEngine engine;    engine.load(QUrl(QStringLiteral("qrc:/form/main.qml")));
    return app.exec();}
但是我想进行以下的改写,用ALL类来获取类A,B,C的对象(对A,B,C进行管理)。
int main(int argc, char *argv[]){    QApplication app(argc, argv);    qmlRegisterType<ALL>("MyLib", 1, 0, "ALL");
    QQmlApplicationEngine engine;    engine.load(QUrl(QStringLiteral("qrc:/form/main.qml")));
    return app.exec();}但是会出现QMetaProperty::read: Unable to handle unregistered datatype for property 这样的错误。难道不在main里
qmlRegisterType<A>("MyLib", 1, 0, "A");    qmlRegisterType<B>("IshidaLib", 1, 0, "B");    qmlRegisterType<C>("IshidaLib", 1, 0, "C");
不行么?

最佳答案

查看完整内容

好像的确是注册在前面
回复

使用道具 举报

尚未签到

2015-5-25 15:15:37 显示全部楼层
beidaochuan 发表于 2015-5-25 17:24
qmlRegisterType注册 和Q_PROPERTY(....) 的声明是不是有先后顺序,

好像的确是注册在前面
回复

使用道具 举报

尚未签到

2015-5-25 15:37:44 显示全部楼层
要注册在qml里面的对象必须是QObject类及子类,跟你什么all,a,b,c没关系
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2015-5-25 16:07:32 显示全部楼层
谢谢您的回答,我知道必须是QObject类及子类,但是我想只注册
qmlRegisterType<ALL>("IshidaLib", 1, 0, "ALL");
而不注册
qmlRegisterType<A>("MyLib", 1, 0, "A");   
qmlRegisterType<B>("IshidaLib", 1, 0, "B");   
qmlRegisterType<C>("IshidaLib", 1, 0, "C");
而ALL类中使用了A,B,C。
这样可以么
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2015-5-25 16:16:08 显示全部楼层
Joey_Chan 发表于 2015-5-25 15:37
要注册在qml里面的对象必须是QObject类及子类,跟你什么all,a,b,c没关系

我是这样写的
// .h
class ALL : public QObject
{
Q_OBJECT
public:
explicit ALL(QObject *parent = 0);

Q_PROPERTY(A* bmA READ bmA NOTIFY bmAChanged)
Q_INVOKABLE A *bmA();

Q_PROPERTY(B* bmB READ bmB NOTIFY bmBChanged)
Q_INVOKABLE B *bmB();
Q_PROPERTY(C* bmC READ bmC NOTIFY bmCChanged)
Q_INVOKABLE C *bmA();

private:
A *a;
B * b;
C *c;

signals:
void bmAChanged();
void bmBChanged();
void bmCChanged();

public slots:
};

//.cpp
ALL::ALL(QObject *parent) : QObject(parent)
{
a = new A(this);
b = new B(this);
c = new C(this);
}

A *ALL::bmA()
{
return a;
}

B *ALL::bmB()
{
return b;
}

C *ALL::bmC()
{
return c;
}
回复

使用道具 举报

尚未签到

2015-5-25 17:19:35 显示全部楼层
问题可能出在你的abc这三个,直接return给qml了。

我记得qml是不能直接使用qt C++的object,好像也是要注册的。
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2015-5-25 17:21:46 显示全部楼层
Joey_Chan 发表于 2015-5-25 17:19
问题可能出在你的abc这三个,直接return给qml了。

我记得qml是不能直接使用qt C++的object,好像也是要注 ...

是么,还想问您个问题。
qmlRegisterType 必须放在main函数内么。

回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2015-5-25 17:24:58 显示全部楼层
Joey_Chan 发表于 2015-5-25 17:19
问题可能出在你的abc这三个,直接return给qml了。

我记得qml是不能直接使用qt C++的object,好像也是要注 ...

qmlRegisterType注册 和Q_PROPERTY(....) 的声明是不是有先后顺序,
回复

使用道具 举报

尚未签到

2015-5-25 22:48:21 显示全部楼层
beidaochuan 发表于 2015-5-25 17:21
是么,还想问您个问题。
qmlRegisterType 必须放在main函数内么。

这个不必
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了