Как мне сделать QVector из виджетов?

Как создать QVector (или какой-либо другой контейнерный класс) из динамического количества виджетов, например QPushButton или QComboBox в Qt 4?

Я использовал следующее в конструкторе моего оконного класса:

QVector<QComboBox*> foo; // Vector of pointers to QComboBox's

И теперь я хочу заполнить его некоторым количеством элементов управления, которые могут динамически меняться:

for(int count = 0; count < getNumControls(); ++count) {
    foo[count] = new QComboBox();
}

Я искал часы, пытаясь найти ответ на этот вопрос. На форумах Qt упоминается создание QPtrList, но этот класс больше не существует в Qt4. Позже я попытался получить текстовое значение из каждого, используя индексирование в стиле массива или функцию .at().

Я был бы очень признателен за пример объявления, инициализации и заполнения любой структуры данных любого QWidgets (QComboBox, QPushButton и т. д.)


person Charles Burns    schedule 24.08.2009    source источник


Ответы (2)


Ну вот :)

#include <QWidget>
#include <QList>
#include <QLabel>
...
QList< QLabel* > list;
...

list << new QLabel( parent, "label 1" );
..
..

foreach( QLabel* label, list )  {
label->text();
label->setText( "my text" );
}

Если вы пытаетесь просто заставить простой пример работать, важно, чтобы ваши виджеты имели родительские (для контекста/очистки) цели.

Надеюсь это поможет.

person bgs    schedule 24.08.2009
comment
Я хотел вставить поля со списком из файла .ui в список. Я вставил таким образом: QList<QComboBox *> listComboBox; listComboBox << (ui->comboBoxTitle); и получил вот так: QComboBox *comboBox = listComboBox.at(i);, который отлично работает! :) - person zeFree; 23.01.2013
comment
QVector теперь предпочтительнее QList (подробнее). - person ymoreau; 22.08.2017

foo[count] = new QComboBox();

Это не повлияет на размер foo. Если в подсчете индекса еще нет элемента, это не удастся. См. push_back или operator‹‹, которые добавляют элемент в конец списка.

QVector<QComboBox*> foo;
// or QList<QComboBox*> foo;
for(int count = 0; count < getNumControls(); ++count) {
    foo.push_back(new QComboBox());
    // or foo << (new QComboBox());
}

Позже, чтобы получить значения:

foreach (QComboBox box, foo)
{
  // do something with box here
}
person Bill    schedule 26.08.2009