2012-06-03 4 views
0

Я пытаюсь создать графический интерфейс, поэтому, когда вы увеличиваете количество «Статьи», появляется больше статей статей. Например, если я изменил количество статей на 2, я хотел бы, чтобы другая группа входов отображалась для статьи 2, и если количество статей изменится на три, будет три группы входных данных, но поскольку это будет использовать больше чем окно, оно начнет прокручиваться.Расширяемый список входов для QT

Я думал об использовании одного из виджетов дерева, списка или таблицы, но я не уверен, что это даже правильное направление, к которому я должен идти. Может ли кто-нибудь подтолкнуть меня в правильном направлении?

Вот фото, так как мое описание не очень хорошее.

Picture goes here

+0

взглянуть на http://qt-project.org/doc/qt-4.8/qscrollarea.html – sgibb

+2

Примечание: это галерея, а не галерей. – leemes

ответ

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; 
Смежные вопросы