我有一个有趣的问题。我不知道如何结合从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”是“服务器”的不明确基础 context-> setContextProperty(“ server”,server);
model.h:27:ошибка:未定义对“ vtable for Model”的引用
答案 0 :(得分:1)
我将使用“具有”关系而不是“是”关系。看起来像这样:
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");
但是,如果您更加努力解决此后出现的问题,也可以使Model继承private QObject
。
答案 1 :(得分:0)
我解决了更改继承顺序的问题。 SqlTableModel->模型->服务器。