为什么这不在 QVector<QObject*> 中添加 QObject*
Why doesn't this add the QObject* in QVector<QObject*>
我有两个 ViewModel,MainVM
和 AddVM
。在 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->plots().push_back(newPlot());
行外,此函数中的所有内容都按预期工作!这不会在 MainVM
!
的 QVector
中添加 newPlot
编辑
可能最好的方法是像这样在宏中重新定义 getter
:
QType& name(){return m_##name;} \
并且我现有的代码无需任何修改即可工作。
当您调用 mvm->plots()
时,它 returns 是真实绘图向量的副本(这是我的猜测,因为您没有显示 plots()
的作用)。因此,一个新的图被添加到副本而不是原始向量。因此,我认为最好的方法是在 MainVM
中添加一个名为“addPlot()”的函数,例如,您可以在其中直接在内部添加绘图向量。
我有两个 ViewModel,MainVM
和 AddVM
。在 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->plots().push_back(newPlot());
行外,此函数中的所有内容都按预期工作!这不会在 MainVM
!
QVector
中添加 newPlot
编辑
可能最好的方法是像这样在宏中重新定义 getter
:
QType& name(){return m_##name;} \
并且我现有的代码无需任何修改即可工作。
当您调用 mvm->plots()
时,它 returns 是真实绘图向量的副本(这是我的猜测,因为您没有显示 plots()
的作用)。因此,一个新的图被添加到副本而不是原始向量。因此,我认为最好的方法是在 MainVM
中添加一个名为“addPlot()”的函数,例如,您可以在其中直接在内部添加绘图向量。