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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt: преобразованные виджеты  (Прочитано 10565 раз)
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« : Март 04, 2020, 14:35 »

Доброго времени суток!
1) Создал свой класс MyClass.
2) Создал форму
3) На форму добавил виджет
4) Преобразовал добавленный виджет в MyClass
5) Задал ему objeсtName в дизайнере, допустим my_widget
Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Март 04, 2020, 14:40 »

Код:
ui->my_widget
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #2 : Март 04, 2020, 14:41 »

Код:
ui->my_widget
Не. Изнутри класса. К ui родительского объекта ведь так просто не доберёшься...
Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Март 04, 2020, 14:51 »

Код:
this
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Март 04, 2020, 14:53 »

Нет, серьезно, класс MyClass ничего не знает (и не должен знать) о форме, на которой он будет размещен, ведь он может быть не размещен на форме!

Если очень хочется, то можно подняться через parent() на уровень выше (а там и еще выше), но совершенно неясно зачем - виджет должен общаться через сигнал\слоты с окружающим миром.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 04, 2020, 15:03 »

Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Строго говоря - нет. Код создается для класса экземпляров которого может быть сколько угодно. Отличить проще всего по имени, напр
Код
C++ (Qt)
void MyClass::DoSometrhing( .. )
{
 if (this->objectName() == "Вася")
  ..
}
 
Хотя это конечно коряво  Улыбающийся
 
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #6 : Март 04, 2020, 15:07 »

Допустим, в этом классе MyClass есть объект QSpinBox. И ещё 100500 визуальных компонентов.
Я на родительской форме размещаю десяток простых widget, которые затем преобразовываю в MyClass.
А теперь я хочу в родительском классе сохранить значения этих QSpinBox. Я могу пройтись по всем QSpinBox и сохранить их значения, всё хорошо. Но как их различить друг от друга - objectName то у всех одинаковый.
Если бы я знал objectName "контейнера", то я бы в самом классе сохранял/восстанавливал состояния своих визуальных объектов.
Записан

tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #7 : Март 04, 2020, 15:08 »

Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Строго говоря - нет. Код создается для класса экземпляров которого может быть сколько угодно. Отличить проще всего по имени, напр
Код
C++ (Qt)
void MyClass::DoSometrhing( .. )
{
 if (this->objectName() == "Вася")
  ..
}
 
Хотя это конечно коряво  Улыбающийся
Проблема только в том, что objectName будет у всех таких объектов одинаковый...
Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Март 04, 2020, 15:14 »

Сделайте методы QByteArray saveState()/void restoreState(const QByteArray &state) в MyClass. В простом случае можно сделать геттер\сеттер для спинбокса.

А потом проходите по всем MyClass (или конкретному):
Код:
for (auto *child : findChildren<MyClass>()) {
    // получили стейт
    auto state = child->saveState();
    // сохраняем куда-то (в мапу сеттингзы или еще куда)
    map[child->objectName()] = state;
}
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #9 : Март 04, 2020, 15:23 »

Сделайте методы QByteArray saveState()/void restoreState(const QByteArray &state) в MyClass. В простом случае можно сделать геттер\сеттер для спинбокса.

А потом проходите по всем MyClass (или конкретному):
Код:
for (auto *child : findChildren<MyClass>()) {
    // получили стейт
    auto state = child->saveState();
    // сохраняем куда-то (в мапу сеттингзы или еще куда)
    map[child->objectName()] = state;
}
Проблема в подобном решении в том, что я в КАЖДОМ классе, использующем MyClass буду вынужден вызывать эти самые saveState/restoreState. И стОит где-то это забыть и всё...
Хотелось бы как то изнутри MyClass это делать. Один раз написать и забыть. И если бы знать ИЗНУТРИ класса, назначенный ему СНАРУЖИ objectName - было бы просто замечательно.
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 05, 2020, 08:47 »

И если бы знать ИЗНУТРИ класса, назначенный ему СНАРУЖИ objectName - было бы просто замечательно.
Так он и назначается "снаружи" (а не в коде класса) - см код создаваемый дызайнером
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #11 : Март 05, 2020, 18:44 »

Так он и назначается "снаружи" (а не в коде класса) - см код создаваемый дызайнером
Ну так я и спрашиваю, как именно его увидеть изнутри класса? Я и так знаю, что он создается "дызайнером". Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Март 06, 2020, 11:18 »

Ну так я и спрашиваю, как именно его увидеть изнутри класса? Я и так знаю, что он создается "дызайнером". Улыбающийся
Проблема только в том, что objectName будет у всех таких объектов одинаковый...
Нет. "objectName" - обычная пропердь, у экземпляра созданного дызайнером она будет = "Вася", у других пустая строка по умолчанию (или то что им установили)
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #13 : Март 06, 2020, 22:04 »

Нет. "objectName" - обычная пропердь, у экземпляра созданного дызайнером она будет = "Вася", у других пустая строка по умолчанию (или то что им установили)
Вы можете ведь сами проверить - будет не так. Изнутри класса objectName будет одним, а в редакторе - другим.
Я в начале тоже думал, что они должны быть одинаковыми - однако реальность показывает другое.
P.S. Я, конечно, могу допустить, что в винде всё может быть по-другому. Но меня больше интересуют linux и macos
« Последнее редактирование: Март 06, 2020, 22:06 от tux » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 07, 2020, 14:05 »

Вы можете ведь сами проверить - будет не так. Изнутри класса objectName будет одним, а в редакторе - другим.
Я в начале тоже думал, что они должны быть одинаковыми - однако реальность показывает другое.
Неясно что и как Вы проверяли. Если напр Вы печатали objectName в конструкторе MyClass, то он будет пустым. Только после того как код дызайнера выполнит setObjectName он станет заданным, и только для этого экземпляра. Если не согласны - запостите проект в zip'е, а иначе нет нужды проверять то что следует из доки класса и общих принципов языка.

P.S. Я, конечно, могу допустить, что в винде всё может быть по-другому. Но меня больше интересуют linux и macos
И не надо так плохо думать о людях - моя платформа OSX
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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