【问题标题】:Why doesn't this add the QObject* in QVector<QObject*>为什么这不在 QVector<QObject*> 中添加 QObject*
【发布时间】:2020-10-29 17:15:31
【问题描述】:

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

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

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

PROPERTY 宏执行此操作:

#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:

class AddVM : public QObject
{
    Q_OBJECT
    PROPERTY(Plot*, newPlot)
public:
    explicit AddVM(QObject *parent = nullptr);
    Q_INVOKABLE void addNewPlot();
}; 

除了AddVM.cpp,我还有这些:

#include "MainVM.h"
extern MainVM *mvm;

addNewPlot 函数有这些说明:

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-&gt;plots().push_back(newPlot()); 行之外,此函数中的所有内容都按预期工作!这不会在MainVMQVector 中添加newPlot

编辑

可能最好的方法是像这样在宏中重新定义getter

QType& name(){return m_##name;} \

并且我现有的代码无需任何修改即可工作。

【问题讨论】:

    标签: qt extern qvector qproperty


    【解决方案1】:

    当您调用mvm-&gt;plots() 时,它会返回真实绘图向量的副本(这是我的猜测,因为您没有显示plots() 的作用)。因此,将新图添加到副本而不是原始向量。所以,我认为最好的方法是在MainVM 中添加一个名为“addPlot()”的函数,例如,您可以在内部直接添加到绘图向量中。

    【讨论】:

    • 是的,在宏中它返回m_##name,名称是plots。在MainVM 中添加一个函数将起作用。
    • 我在 MainVM 中添加了 QVector&lt;Plot*&gt;&amp; plotsReference(){ return m_plots;} 函数,而不是在 addNewPlot() 中添加了 plots()-&gt;push_back,现在我添加了 plotsReference()-&gt;push_back。谢谢。
    猜你喜欢
    • 2015-07-31
    • 2013-02-13
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多