【问题标题】:Using QSharedPointer as Data Model使用 QSharedPointer 作为数据模型
【发布时间】:2020-08-03 20:55:01
【问题描述】:

我有一个应用程序,其中包含多个编写为独立类的“输入小部件”,它们都存储了相应类的共享指针,即显示的数据。在这些小部件中的每一个中,用户都可以查看和操作一些不同的数据。所有这些数据都用作输入,也用作计算的输出。 其中两个小部件共享相同的数据/类,但操作此类的不同成员。

如何实现在一个小部件中操作数据自动更新另一个小部件?

所以问题是:我可以在两个类之间共享一个 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;
};

【问题讨论】:

  • 旁白:你不需要delete spinBox;,它在基地~QObject()被销毁

标签: c++ qt qsharedpointer


【解决方案1】:

您可以这样做,假设foo::manipulate 发出一个信号,您的其他小部件连接到该信号。

我还建议确保foo::operator= 发出changed,以便setData 更新两个小部件。

与您的问题不严格相关,您显示的代码中有错误。

connect(this->spinBox, &QSpinBox::editingFinished, this, &MyWidget::evokedByGuiManipulation);

editingFinished 没有QSharedPointer&lt;baz&gt; 可以传递给evokedByGuiManipulation。你是说

data->manipulate(spinBox->value());

【讨论】:

  • 好的,抱歉,我没有充分说明我的包装类foo。所以在这里我遇到了一个问题,当我执行 foo::manipulate 时,我总是得到一个新的 SharedPointer,所以我还必须建立一个新的连接。但我真正想要的是就地操作实际数据
  • 为什么你每次都有一个新的foo,而不是多次共享同一个foo
  • Imageine setData 带有来自计算的新数据。现在我想同时更新两个连接的小部件,而不是为两个小部件设置新的foo
  • 然后执行*data = *value;,并让foo::operator=发出changed。我也会把它改成setData(const foo &amp; value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多