c++ - 使用 QSharedPointer 作为数据模型
问题描述
我有一个应用程序,其中包含多个编写为独立类的“输入小部件”,它们都存储了显示数据的相应类的共享指针。在这些小部件中的每一个中,用户都可以查看和操作一些不同的数据。所有这些数据都用作输入,也用作计算的输出。其中两个小部件共享相同的数据/类,但操作该类的不同成员。
如何实现在一个小部件中操作数据会自动更新另一个小部件?
所以问题是:我可以在两个类之间共享一个 QSharedPointer,然后将它连接到一个“this”槽,这样当我在其中一个类中操作指针的值时,另一个可以对这些数据做一些事情(如更新它是gui)?
我的意图是,因为我必须将实际数据存储在另一个 QSharedPointer 中,所以在那个告诉另一个小部件的共享指针上进行连接。
我想到了这样的事情:
#include <QWidget>
#include <QSpinBox>
class MyWidget : QWidget // A template widget to be placed in MainWindow
{
Q_OBJECT
public:
MyWidget()
{
this->spinBox = new QSpinBox(this);
connect(this->spinBox, &QSpinBox::editingFinished, this, &MyWidget::evokedByGuiManipulation);
connect(this->data.data(), &foo::changed, this, &MyWidget::updateGui);
}
virtual ~MyWidget() {delete spinBox;}
public slots:
void setData(QSharedPointer<foo> value)
{
data = value;
}
void evokedByGuiManipulation()
{
data->manipulate(spinBox->value());
}
void updateGui()
{
this->spinBox->setValue(data->getData()->datamember);
}
protected:
QSharedPointer<foo> data;
private:
QSpinBox *spinBox;
};
更新
而类 foo 实际上是一个存储实际数据的包装器class baz
。喜欢:
class foo
{
Q_GADGET
public:
foo(){}
QSharedPointer<baz> getData() {return actualData;}
public slots :
void setActualData(QSharedPointer<baz> value)
{
actualData = value;
emit changed();
}
signals:
void changed();
private:
QSharedPointer<baz> actualData;
};
解决方案
你可以这样做,假设它foo::manipulate
发出一个你的其他小部件连接到的信号。
我还建议确保foo::operator=
emit changed
,以便setData
更新两个小部件。
与您的问题不严格相关,您显示的代码中有错误。
connect(this->spinBox, &QSpinBox::editingFinished, this, &MyWidget::evokedByGuiManipulation);
editingFinished
没有QSharedPointer<baz>
要传递给evokedByGuiManipulation
. 你的意思
data->manipulate(spinBox->value());
推荐阅读
- python - 使用 .loc 的 Python Pandas 数据帧中的 KeyError
- angular - 显示隐藏成功失败警报
- javascript - 反应输入焦点事件以显示其他组件
- javascript - jQuery无法在移动设备上运行
- swift - 为什么将NSSortDescriptor 数组放入sortDescriptors?
- python - 删除元组列表中的项目
- c++ - 这个函数如何改变堆栈上声明的变量的值?
- jsp - 升级到 tomcat 8 时出错严重:servlet jsp 的 Servlet.service() 抛出异常
- asp.net-mvc - Web API Request.Content 截断前 3 个字符
- c# - 在 C# 中将对象转换为字符串