c++ - 在派生类中调用 Q_INVOKABLE 方法
问题描述
我有一个有趣的问题。我不知道如何组合从 QObject 继承的两个类。在基类的派生类中使用 Q_INVOKABLE 方法来解决我的问题。我想在各种“模型”中多次使用“loadFromJson”。
我已经尝试定义 Q_OBJECT 宏,并重建类的逻辑。
//model.h
class Model : public QObject{
Q_OBJECT
public:
Q_INVOKABLE bool loadFromJson(const QString &data);
}
//sqltablemodel.h
class SqlTableModel : public QSqlTableModel{
//some code
}
//server.h
class Server : public SqlTableModel, Model
{
Q_OBJECT
public:
explicit Server(QString tableName = "");
};
//main.cpp
Server *server = new Server();
context->setContextProperty("server", server);
//
//server.qml
server.loadFromJson("123"); // not working
/*
If i remove QObject from Model then i can't call loadFromJson even Q_OBJECT defined, otherwise Server is ambigous using QObject. But i want to use methods from both base classes SqlTableModel & Model in derived Server with Q_INVOKABLE ability.
*/
main.cpp:41: ошибка: 'QObject' 是 'Server' context->setContextProperty("server", server) 的模糊基础;
model.h:27:ошибка:未定义对“模型的vtable”的引用
解决方案
我会使用“有”关系而不是“是”关系。它看起来像这样:
class Server : public SqlTableModel {
Q_OBJECT
Q_PROPERTY(Model* model READ model WRITE setModel NOTIFY modelChanged)
Model* _model;
public:
explicit Server(QObject* parent = nullptr)
: SqlTableModel(parent), _model(new Model(this)) {}
signals:
void modelChanged(Model* model);
public:
Model* model() const noexcept { return _model; }
void setModel(Model* m) noexcept { _model = m; }
};
然后你会在你的 qml 中这样调用它:server.model.loadFromJson("123");
private QObject
但是,如果您更努力地解决之后出现的问题,您也可以让模型继承。
推荐阅读
- sockets - 什么是 .sock 文件以及如何与它们通信
- pytest - 传递多个参数以在 Pytest 中实例化多个对象
- ruby-on-rails - 打印显示空白对角线截止
- node.js - Confluence-api 查询
- mqtt - 打开端口时,Mosquitto 状态错误权限被拒绝
- javascript - 生成一个 PDF 文件,然后将该文件保存在本地以验证它是否包含我期望的数据
- nginx - 客户端取消的请求是否通过 nginx 传递到 fastcgi
- synchronization - eXist-db 不同服务器之间的内容同步问题
- c++ - 我可以使用 std::vector::swap 来修改共享向量吗?
- python - AWS Lambda + API Gateway 导致油门出现 500 错误