Qt Designer: Создать массив виджетов - PullRequest
7 голосов
/ 24 февраля 2012

возможно, это глупый вопрос, но я новичок в C ++ и в Qt.Приносим извинения за неудобства.

В Qt Designer я создаю несколько ярлыков (например):

my_label1
my_label2
my_label3
...
my_label n

Затем, если я хочу скрыть их, я делаю это:

ui->my_label1->hide();
ui->my_label2->hide();
ui->my_label3->hide();
...
ui->my_labeln->hide();

Однако я хотел бы определить метки как

my_label[n]

Так что тогда я смогу сделать это:

for(i=0;i<n;i++)
    {
    ui->my_label[n]->hide();
    }

Я прочитал, что я могу определить виджеткак:

QLabel* my_label[5];

но есть ли способ сделать то же самое из Qt Designer?

Заранее спасибо!

Редактировать:

Наконец-то ярешил сделать прямое назначение:

QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;

Затем я могу сделать, например:

for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...

Затем я смог выполнить итерации.Я считаю, что это не самый чистый способ сделать это, но, учитывая мои базовые знания Qt, я в порядке.

Большое спасибо за ваши ответы!Это отличный сайт с замечательными людьми.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Вместо создания явного массива вы можете назвать свои виджеты по определенной схеме, а затем использовать QObject :: findChildren () в родительском виджете, чтобы получить список виджетов, которыми вы являетесь после того, как.

Если вы хотите скрыть только виджеты, вы можете поместить все виджеты, которые хотите скрыть, в невидимый QFrame (установите frameShape в NoFrame) и скрыть их все, вызвав setVisible(false) на QFrame. Это может вызвать некоторые нежелательные побочные эффекты с макетами, поэтому вам, возможно, придется настроить некоторые параметры политики размера.

Если вы хотите скрыть элементы управления, чтобы имитировать пользовательский интерфейс типа мастера, вы можете проверить QStackedWidget .

3 голосов
/ 24 февраля 2012

Наконец я решил сделать прямое назначение:

QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;

Тогда я могу сделать, например:

for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...

Тогда я смог выполнить итерации. Я считаю, что это не самый чистый способ сделать это, но, учитывая мои базовые знания Qt, я в порядке.

Большое спасибо за ваши ответы и вашу поддержку! Это отличный сайт с замечательными людьми.

1 голос
/ 06 ноября 2014

У меня есть другой грязный обходной путь:

в заголовочном файле

// .hpp
class UiBlabla : public QWidget {
    ...
    QLabel** labels;
};

в исходном файле

// constructor
ui->setupUi(this);

labels = new QLabel*[10]{ui->label_0, ui->label_1, ui->label_2, ui->label_3,
                         ui->label_4, ui->label_5, ui->label_6, 
                         ui->label_7, ui->label_8, ui->label_9};
0 голосов
/ 24 февраля 2012

Я не видел ничего в QtDesigner, чтобы сделать это, но есть пара относительно простых способов получить такое поведение.

1) Просто сохраните указатели my_labelx (из QtDesigner) в массиве (или, что лучше, QVector):

QVector<QLabel*> my_labels;
my_labels.push_back(ui->my_label1);
my_labels.push_back(ui->my_label2);

Затем вы можете перебрать QVector.

for(int i=0; i < my_labels.size(); ++i) {
   my_labels[i]-> hide();
}
// or with QFOREACH
foreach(QLabel* label, my_labels)
  label->hide();

Для добавления всех меток в QVector требуется небольшая настройка,но с положительной стороны вы делаете это только один раз.

2) В зависимости от макета вашего графического интерфейса все ваши метки могут быть дочерними по отношению к объекту-контейнеру и перебирать дочерние элементы

...