Вы должны поместить все виджеты, необходимые для одной статьи в один пользовательский виджет. Всякий раз, когда изменяется поле со спином (код в слоте), вы можете добавить/удалить один экземпляр такого пользовательского виджета в область прокрутки.
Внутри конструктора этого пользовательского класса виджетов (назовем его 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;
взглянуть на http://qt-project.org/doc/qt-4.8/qscrollarea.html – sgibb
Примечание: это галерея, а не галерей. – leemes