Russian Qt Forum
Май 15, 2024, 06:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обращение к динамическим именам объектов  (Прочитано 7186 раз)
FIPC
Гость
« : Апрель 11, 2011, 19:37 »

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

Если конкретнее - допустим есть матрица полей text edit размером 10 на 10.
Имена полей формата:
text1_1   text1_2 ....  text1_10
text2_1 .................. text2_10
.........................................
text10_1 ................. text10_10

У нас есть какое то текстовое поле, из которого мы получаем количество видимых полей по х и по у.
Например
text1_1 text1_2 text1_3
text2_1 text2_2 text2_3
Остальное же необходимо сделать невидимыми.

Сам вопрос - каким образом в алгоритме сделать так, чтобы в строке:
ui->textХ_Х->setVisible(1);
Вместо textХ_Х в цикле подставлялась динамически формируемая строка.
В php это делается очень просто с помощью склеивания и служебных символов, но как это делается здесь интернет умалчивает.

Заранее спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 11, 2011, 20:02 »

Можно использовать objectName. А можно вот так QMap <QPair <int, int>, QWidget*> (или QMap <QString /*name*/, QWidget*>).
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
madRoger
Гость
« Ответ #2 : Апрель 11, 2011, 20:05 »

QObject::findChild
Записан
FIPC
Гость
« Ответ #3 : Апрель 12, 2011, 00:03 »

Тут представлены просто попытки задать объект класса как что то формируемое. Основной вопрос в механизме и он все еще не исчерпал себя.

QMap не подходит ибо при следующем коде
 QString S="text1_2";
 QMap<QString, QString> map;
 map["textt"]=S;
 ui->map("textt")->setText("atatatata");
Выскакивает:
 'class Ui::MainWindow' has no member named 'map'

findChild тоже не особо работает, но тут судя по всему мой косяк - подскажите пожалуйста, что не так?
 QString S="text1_2";
 QWidget parentWidget;
 QTextEdit *textt = parentWidget->findChild<QTextEdit *>(S);
 ui->textt->setText("atatatata");
Выскакивает:
 base operand of '->' has non-pointer type 'QWidget'
 'class Ui::MainWindow' has no member named 'textt'
Прогнозируя вопросы - если изменить класс с QWidget на QObject, просто напросто меняется соответствующий текст в первой ошибке

Если есть еще идеи, буду благодарен.
« Последнее редактирование: Апрель 12, 2011, 01:31 от FIPC » Записан
mutineer
Гость
« Ответ #4 : Апрель 12, 2011, 00:31 »

Если обращаться нужно только по индексам, не проще ли массив указателей сделать?

2 FIPC:
Оба примера бред какой-то. Ты про плюсы хоть что-нить читал вообще?
« Последнее редактирование: Апрель 12, 2011, 00:34 от mutineer » Записан
FIPC
Гость
« Ответ #5 : Апрель 12, 2011, 01:20 »

Если обращаться нужно только по индексам, не проще ли массив указателей сделать?

2 FIPC:
Оба примера бред какой-то. Ты про плюсы хоть что-нить читал вообще?

По поводу массива указателей идея была с самого начала, но синтаксис не позволяет (если у меня конечно голова на месте), она очень быстро отвалилась.

Что именно тебе в примерах не нравится? Это просто коротенькие вырезки из обработчика события.
Записан
mutineer
Гость
« Ответ #6 : Апрель 12, 2011, 01:59 »

Синтаксис чего не позволяет?

1 пример:
создал map с ключем строкой и значением строкой в текущей области видимости, а вызываешь почему-то как члена класса ui. Откуда ж мапу быть в том классе? Да и у строки (а ведь map["textt"] (скобочки не те, опять же) возвращает именно строку) нету метода setText().

2 пример:
parentWidget не является указателем, а обращаешься ты к его методу как по указателю. Детей у него в этом методе не создается, ну да ладно, предположим что между созданием parentWidget и поиском у него Child есть какой-то не показанный тут код, который этих детей добавляет. Но с чего ты взял что findChild это шаблонная функция, которой нужно шаблонный параметр указывать?(в угловых скобочках который). Ну и опять же textt создан тут, присвоен тут, а обращаешься ты к нему через какой-то ui
Записан
Disaron
Гость
« Ответ #7 : Апрель 12, 2011, 11:47 »

Но с чего ты взял что findChild это шаблонная функция, которой нужно шаблонный параметр указывать?(в угловых скобочках который).
Справедливости ради - она таки шаблонная.
Записан
mutineer
Гость
« Ответ #8 : Апрель 12, 2011, 11:53 »

Но с чего ты взял что findChild это шаблонная функция, которой нужно шаблонный параметр указывать?(в угловых скобочках который).
Справедливости ради - она таки шаблонная.

Да, извиняюсь, тут недосмотрел
Записан
pokidoff
Гость
« Ответ #9 : Апрель 15, 2011, 12:30 »

Код:
//Объявляем хранилище такого типа
QHash<QPair<int, int> , QTextEdit*> map;

//Заполняем хранилище нашими виджетами
for (int i=1; i<= rowCount; i++){
    for(int j=1; j<= colCount; j++){

         map.insert(QPair<int, int>(i,j), new QTextEdit(parent));
    }
}


//Обращаться так
map.value(QPair<int,int>(x,y))->setText('Bla bla bla');
QString text = map.value(QPair<int,int>(x,y))->text();

PS: Не забудь либо указать parent при создании виджетов, либо в цикле вызвать для каждого элемента хранилища
delete map.value(QPair<int,int>(x,y))
« Последнее редактирование: Апрель 15, 2011, 14:00 от pokidoff » Записан
RoulanD
Гость
« Ответ #10 : Апрель 19, 2011, 17:08 »

Конечно всё это очень интересно, но если тебе нужен результат то реально не проще ли было сделать двумерный массив нужных тебе объектов
Код
C++ (Qt)
QTextEdit *masTextEdit[100500][100500];
 
а дальше плясать от количества нужных тебе элементов.
Вложенный цикл все дела. Формулу для просчета геометрии составить несложно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 19.