Как получить доступ к вкладке члена класса QTabWidget, используя имя переменной? - PullRequest
0 голосов
/ 15 июля 2011

В функции, над которой я сейчас работаю, я создаю многомерный массив флажков с размерами, указанными пользователем во время выполнения. Чтобы представить измерение «z», я создаю несколько вкладок, каждая из которых представляет отдельное измерение, и создаю массив флажков на каждой вкладке. Вкладки помечены как dim1, dim2, dim3, ... и т. Д.

Проблема, с которой я сталкиваюсь, заключается в том, что для создания массива флажков (в пределах 3 циклов for) я должен вызывать вкладки следующим образом:

checkBoxVector.append(new QCheckBox( ui->dim1 ));

Где checkBoxVector содержит указатели на флажки. Теперь моей первой мыслью было, что я просто создам имя переменной, которая будет меняться с каждым циклом. На каждой итерации будет указано: "dim1", затем "dim2", "dim3", ... и т. Д. Проблема в том, что я не могу ссылаться на вкладки с помощью строковой переменной, я должен ввести фактическое имя вкладка. Вот пример этого кода:

int num = k+1;
QString dim = "dim";
QString tab_name = dim.append(QString("%1").arg(num));
checkBoxVector.append(new QCheckBox( ui->tab_name ));

Это дает мне ошибку "У класса Ui :: MainWindow нет члена с именем tab_name".

Поэтому; у меня вопрос: как я могу применить эту идею изменения имени вкладки в каждом цикле, не вызывая такой ошибки?

РЕДАКТИРОВАТЬ: я думаю, что я забыл упомянуть, что вкладки уже были созданы на этом этапе, и уже были помечены именами "dim1", "dim2", "dim3", .... Единственная проблема, с которой я сталкиваюсь, - как ссылаться на эти вкладки после их создания. Я чувствую, что есть простое синтаксическое решение.

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Кто-то скажет это лучше (для этого есть концептуальное имя), но вы не можете динамически объявлять элементы в c ++ ... если вы хотите, чтобы содержимое QString tab_name было каким-либо образом связано с элементом ui в этой части кода:

QString tab_name = dim.append(QString("%1").arg(num));
checkBoxVector.append(new QCheckBox( ui->tab_name ));

Компилятору нужно , чтобы знать во время компиляции с членом ui, который он будет использовать для поиска родителя нового QCheckBox.

Поправьте меня, если я ошибаюсь, у вас есть dimz вкладок и dimy*dimx QcheckBox на каждой вкладке. Вы не знаете dim*, когда создаете файл ui?

Так что создайте свой собственный виджет (QWidget), он будет хранить массив QcheckBox*, который вы можете динамически создать, например, в конструкторе. Этот виджет позаботится о правильном расположении флажков.

Затем, наконец, вы создаете свои собственные QTabWidget, которые будут создавать dimz вкладок вашего виджета. Вы получите доступ к своим вкладкам с их индексами, соответствующими их z координате.

0 голосов
/ 15 июля 2011

Вы пытаетесь сослаться на переменную-член, которая не существует:

int num = k+1;
QString dim = "dim";
QString tab_name = dim.append(QString("%1").arg(num));
checkBoxVector.append(new QCheckBox( ui->tab_name ));

Ошибка вызвана тем, что вы передаете несуществующую переменную-член конструктору QCheckBox. У объекта, на который указывает указатель пользовательского интерфейса, нет переменной-члена с именем tab_name. Если я правильно понял ваше описание, просто передайте локальную переменную tab_name конструктору QCheckBox следующим образом:

checkBoxVector.append(new QCheckBox( tab_name ));
0 голосов
/ 15 июля 2011

Храните указатели на вкладки в массиве и индексируйте его с помощью переменной, которую вы используете для перебора третьего измерения вашего многомерного массива флажков, ваш код будет выглядеть примерно так:

QTabWidget* tabs[3];
tabs[0] = ui->dim1;
tabs[1] = ui->dim2;
tabs[2] = ui->dim3;

// ... and then

checkBoxVector.append(new QCheckBox( tabs[z] ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...