首页 > 解决方案 > 在派生类中调用 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”的引用

标签: c++qt

解决方案


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

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但是,如果您更努力地解决之后出现的问题,您也可以让模型继承。


推荐阅读