![](/img/trans.png)
[英]Does the number of references change when calling data() of a qsharedpointer
[英]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.