簡體   English   中英

使用 QSharedPointer 作為數據 Model

[英]Using QSharedPointer as Data Model

我有一個應用程序,其中包含多個編寫為獨立類的“輸入小部件”,它們都存儲了相應的 class 的共享指針,這是顯示的數據。 在這些小部件中的每一個中,用戶都可以查看和操作一些不同的數據。 所有這些數據都用作輸入,也用作計算的 output。 其中兩個小部件共享相同的數據/類,但操作此 class 的不同成員。

如何實現在一個小部件中操作數據會自動更新另一個小部件?

所以問題是:我可以在兩個類之間共享一個 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;
};

更新

而 class 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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM