首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不在QVector<QObject*>中添加QObject*

为什么不在QVector<QObject*>中添加QObject*
EN

Stack Overflow用户
提问于 2020-07-09 07:06:18
回答 1查看 57关注 0票数 1

我有两个ViewModels,MainVMAddVM。在main.cpp中,MainVM是这样声明的:

代码语言:javascript
复制
MainVM *mvm;    
int main(int argc, char *argv[])
{
    ...
    mvm = new MainVM();
    ...
    engine.rootContext()->setContextProperty("mainContext", mvm);
    engine.rootContext()->setContextProperty("addContext", new AddVM());
    ...
}

MainVM中,我有一个Q_PROPERTY

代码语言:javascript
复制
class MainVM : public QObject
{
    Q_OBJECT
    ...
    PROPERTY(QVector<Plot*>, plots)
    ...
public:
    ...
    QSqlDatabase db;
    int maxPlotId, maxSpaceId, maxTenantId, maxHeadId, maxLeaseId;
    ...
};

PROPERTY宏这样做:

代码语言:javascript
复制
#define PROPERTY(QType, name) \
    Q_PROPERTY(QType name READ name WRITE set##name NOTIFY name##Changed) \
    public: \
        QType name(){return m_##name;} \
        void set##name(QType value){if(m_##name != value){m_##name = value; emit name##Changed();}} \
        Q_SIGNAL void name##Changed(); \
    private: \
        QType m_##name;

在我的AddVM中,我有另一个Q_PROPERTY newPlot和一个Q_INVOKABLE addNewPlot:

代码语言:javascript
复制
class AddVM : public QObject
{
    Q_OBJECT
    PROPERTY(Plot*, newPlot)
public:
    explicit AddVM(QObject *parent = nullptr);
    Q_INVOKABLE void addNewPlot();
}; 

AddVM.cpp之上,我有以下内容:

代码语言:javascript
复制
#include "MainVM.h"
extern MainVM *mvm;

addNewPlot函数有以下说明:

代码语言:javascript
复制
void AddVM::addNewPlot()
{
    mvm->db.open();
    QSqlQuery query;
    query.prepare("INSERT INTO Plots (Name, Description) VALUES(:Name, :Description)");
    query.bindValue(":Name", newPlot()->name());
    query.bindValue(":Description", newPlot()->description());
    query.exec();
    mvm->db.close();

    mvm->plots().push_back(newPlot());
    setnewPlot(new Plot());
    newPlot()->setid(++mvm->maxPlotId);
}

除了mvm->plots().push_back(newPlot());行之外,此函数中的所有内容都按预期工作!这并没有将newPlot添加到QVector of MainVM中!

编辑

最好的方法可能是在宏中重新定义getter,如下所示:

代码语言:javascript
复制
QType& name(){return m_##name;} \

这样,我现有的代码就可以工作了,无需任何修改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 07:31:12

当您调用mvm->plots()时,它返回真实绘图向量的副本(这是我的猜测,因为您没有显示plots()做了什么)。因此,一个新的地块被添加到副本中,而不是原始向量。因此,我认为最好的方法是在MainVM中添加一个叫做‘addPlot()’的函数--例如,您可以在其中直接和内部添加到绘图向量中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62809279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档