【问题标题】:Call Q_INVOKABLE method in derived class [duplicate]在派生类中调用 Q_INVOKABLE 方法
【发布时间】:2019-11-16 21:50:26
【问题描述】:

我有一个有趣的问题。我不知道如何组合从 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


    【解决方案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

    【讨论】:

    • 哦,谢谢。根据我的经验,这是一个很好的设计,但并不是我所追求的目标。
    • 那么您可以使用private QObject 解决方案。如果您私下从 QObject 继承,据我所知,moc 不会有问题@exru
    • 好的。我刚刚删除了 SqlTableModel 但 Q_INVOKABLE 仍然无法正常工作。
    • 删除时有什么错误吗?
    • 构建 -> 运行 -> “loadFromJson 不是函数”
    【解决方案2】:

    我解决了更改继承顺序的问题。 SqlTableModel->Model->Server.

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2012-05-31
      • 2013-03-23
      • 1970-01-01
      • 2014-03-17
      • 2016-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多