0

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

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

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

1 回答 1

0

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

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

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

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

editingFinished没有QSharedPointer<baz>要传递给evokedByGuiManipulation. 你的意思

data->manipulate(spinBox->value());
于 2020-04-21T07:59:36.303 回答