Russian Qt Forum
Март 29, 2024, 13:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Qt: преобразованные виджеты
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Qt: преобразованные виджеты (Прочитано 9255 раз)
tux
Крякер
Offline
Сообщений: 399
Qt: преобразованные виджеты
«
:
Март 04, 2020, 14:35 »
Доброго времени суток!
1) Создал свой класс MyClass.
2) Создал форму
3) На форму добавил виджет
4) Преобразовал добавленный виджет в MyClass
5) Задал ему objeсtName в дизайнере, допустим my_widget
Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Записан
Digital Art
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Qt: преобразованные виджеты
«
Ответ #1 :
Март 04, 2020, 14:40 »
Код:
ui->my_widget
Записан
tux
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #2 :
Март 04, 2020, 14:41 »
Цитата: Авварон от Март 04, 2020, 14:40
Код:
ui->my_widget
Не. Изнутри класса. К ui родительского объекта ведь так просто не доберёшься...
Записан
Digital Art
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Qt: преобразованные виджеты
«
Ответ #3 :
Март 04, 2020, 14:51 »
Код:
this
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Qt: преобразованные виджеты
«
Ответ #4 :
Март 04, 2020, 14:53 »
Нет, серьезно, класс MyClass ничего не знает (и не должен знать) о форме, на которой он будет размещен, ведь он может быть не размещен на форме!
Если очень хочется, то можно подняться через parent() на уровень выше (а там и еще выше), но совершенно неясно зачем - виджет должен общаться через сигнал\слоты с окружающим миром.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Qt: преобразованные виджеты
«
Ответ #5 :
Март 04, 2020, 15:03 »
Цитата: tux от Март 04, 2020, 14:35
Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Строго говоря - нет. Код создается для класса экземпляров которого может быть сколько угодно. Отличить проще всего по имени, напр
Код
C++ (Qt)
void
MyClass
::
DoSometrhing
(
..
)
{
if
(
this
->
objectName
(
)
==
"Вася"
)
..
}
Хотя это конечно коряво
Записан
tux
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #6 :
Март 04, 2020, 15:07 »
Допустим, в этом классе MyClass есть объект QSpinBox. И ещё 100500 визуальных компонентов.
Я на родительской форме размещаю десяток простых widget, которые затем преобразовываю в MyClass.
А теперь я хочу в родительском классе сохранить значения этих QSpinBox. Я могу пройтись по всем QSpinBox и сохранить их значения, всё хорошо. Но как их различить друг от друга - objectName то у всех одинаковый.
Если бы я знал objectName "контейнера", то я бы в самом классе сохранял/восстанавливал состояния своих визуальных объектов.
Записан
Digital Art
tux
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #7 :
Март 04, 2020, 15:08 »
Цитата: Igors от Март 04, 2020, 15:03
Цитата: tux от Март 04, 2020, 14:35
Вопрос: могу ли я как то из класса MyClass увидеть этот самый my_widget? Без использования редактора, просто из кода.
Строго говоря - нет. Код создается для класса экземпляров которого может быть сколько угодно. Отличить проще всего по имени, напр
Код
C++ (Qt)
void
MyClass
::
DoSometrhing
(
..
)
{
if
(
this
->
objectName
(
)
==
"Вася"
)
..
}
Хотя это конечно коряво
Проблема только в том, что objectName будет у всех таких объектов одинаковый...
Записан
Digital Art
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Qt: преобразованные виджеты
«
Ответ #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
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #9 :
Март 04, 2020, 15:23 »
Цитата: Авварон от Март 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;
}
Проблема в подобном решении в том, что я в КАЖДОМ классе, использующем MyClass буду вынужден вызывать эти самые saveState/restoreState. И стОит где-то это забыть и всё...
Хотелось бы как то изнутри MyClass это делать. Один раз написать и забыть. И если бы знать ИЗНУТРИ класса, назначенный ему СНАРУЖИ objectName - было бы просто замечательно.
Записан
Digital Art
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Qt: преобразованные виджеты
«
Ответ #10 :
Март 05, 2020, 08:47 »
Цитата: tux от Март 04, 2020, 15:23
И если бы знать ИЗНУТРИ класса, назначенный ему СНАРУЖИ objectName - было бы просто замечательно.
Так он и назначается "снаружи" (а не в коде класса) - см код создаваемый дызайнером
Записан
tux
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #11 :
Март 05, 2020, 18:44 »
Цитата: Igors от Март 05, 2020, 08:47
Так он и назначается "снаружи" (а не в коде класса) - см код создаваемый дызайнером
Ну так я и спрашиваю, как именно его увидеть изнутри класса? Я и так знаю, что он создается "дызайнером".
Записан
Digital Art
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Qt: преобразованные виджеты
«
Ответ #12 :
Март 06, 2020, 11:18 »
Цитата: tux от Март 05, 2020, 18:44
Ну так я и спрашиваю, как именно его увидеть изнутри класса? Я и так знаю, что он создается "дызайнером".
Цитата: tux от Март 04, 2020, 15:08
Проблема только в том, что objectName будет у всех таких объектов одинаковый...
Нет. "objectName" - обычная пропердь, у экземпляра созданного дызайнером она будет = "Вася", у других пустая строка по умолчанию (или то что им установили)
Записан
tux
Крякер
Offline
Сообщений: 399
Re: Qt: преобразованные виджеты
«
Ответ #13 :
Март 06, 2020, 22:04 »
Цитата: Igors от Март 06, 2020, 11:18
Нет. "objectName" - обычная пропердь, у экземпляра созданного дызайнером она будет = "Вася", у других пустая строка по умолчанию (или то что им установили)
Вы можете ведь сами проверить - будет не так. Изнутри класса objectName будет одним, а в редакторе - другим.
Я в начале тоже думал, что они должны быть одинаковыми - однако реальность показывает другое.
P.S. Я, конечно, могу допустить, что в винде всё может быть по-другому. Но меня больше интересуют linux и macos
«
Последнее редактирование: Март 06, 2020, 22:06 от tux
»
Записан
Digital Art
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Qt: преобразованные виджеты
«
Ответ #14 :
Март 07, 2020, 14:05 »
Цитата: tux от Март 06, 2020, 22:04
Вы можете ведь сами проверить - будет не так. Изнутри класса objectName будет одним, а в редакторе - другим.
Я в начале тоже думал, что они должны быть одинаковыми - однако реальность показывает другое.
Неясно что и как Вы проверяли. Если напр Вы печатали objectName в конструкторе MyClass, то он будет пустым. Только после того как код дызайнера выполнит setObjectName он станет заданным, и только для этого экземпляра. Если не согласны - запостите проект в zip'е, а иначе нет нужды проверять то что следует из доки класса и общих принципов языка.
Цитата: tux от Март 06, 2020, 22:04
P.S. Я, конечно, могу допустить, что в винде всё может быть по-другому. Но меня больше интересуют linux и macos
И не надо так плохо думать о людях - моя платформа OSX
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...