在派生类中调用q_invokable方法

Call Q_INVOKABLE method in derived class

本文关键字:invokable 方法 调用 派生      更新时间:2023-10-16

我有一个有趣的问题。我不知道如何将两个从qobject继承的类组合。使用q_invokable方法从基类派生的类中使用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("服务器",服务器(;

model.h:27:„极:未定义的引用" vtable for Model"

我会使用"有"关系而不是"是"。看起来像这样:

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

i通过更改继承顺序解决了问题。sqltablemodel-> model->服务器。