1 つの記事に必要なすべてのウィジェットを 1 つのカスタム ウィジェットに配置する必要があります。スピン ボックスが変更されると (スロット内のコード)、そのようなカスタム ウィジェットの 1 つのインスタンスをスクロール領域に追加/削除できます。
このカスタム ウィジェット クラス ( と呼びましょうArticleWidget
) のコンストラクター内で、子ウィジェットで行われた変更を通知するシグナルをカスタム ウィジェットで定義する必要があります。カスタム ウィジェット内でこれらを接続します。
ArticleWidget::ArticleWidget(QWidget *parent) :
QWidget(parent)
{
ui->setupUi(this); // when you use QtDesigner to design the widget
// propagate signals from my inner widgets to myself:
connect(ui->title, SIGNAL(textChanged(QString)),
SIGNAL(titleChanged(QString)));
}
外側のウィジェットでは、そのようなカスタム ウィジェットを作成するたびに、その信号を処理スロットに接続します。
void OuterWidget::articleCountChanged(int)
{
...
if(/*increased*/)
{
ArticleWidget *article = new ArticleWidget(this);
connect(article, SIGNAL(titleChanged(QString)),
SLOT(art_titleChanged(QString)));
ui->scrollAreaViewport->layout()->addWidget(article);
}
...
}
次を使用して記事ウィジェットにアクセスできますsender()
。
void OuterWidget::art_titleChanged(QString)
{
ArticleWidget *articleWidget = qobject_cast<ArticleWidget*>(sender());
Q_ASSERT(articleWidget); // make sure the signal comes from an ArticleWidget
// if you want to store articles in a vector of custom types,
// you could give this type a pointer to the widget, so you can
// find the index if you have the widget pointer:
foreach(Article *article, articles)
if(article->widget == articleWidget)
article->title = title; // make some changes
}
このコードは、すべての記事を次のような構造体に保持していることを前提としています。
struct ArticleData
{
ArticleWidget *widget;
QString title;
...
};
外側のウィジェット クラスにそれらのベクトルを設定します。
QVector<ArticleData*> articles;