Виджет-контейнер |
Здравствуйте, гость ( Вход | Регистрация )
Виджет-контейнер |
fantom |
10.4.2009, 15:45
Сообщение
#1
|
|
Студент Группа: Участник Сообщений: 47 Регистрация: 29.1.2009 Пользователь №: 515 Спасибо сказали: 1 раз(а) Репутация: 1 |
Возникла необходимость сделать виджет-контейнер. По сути это обычный виджет в котором могут находится другие виджеты вместе со своими дочерними виджетами. Работа с ним будет происходить примерно следующим образом: в дизайнере мы переносим мышкой необходимый виджет на виджет-контейнер, и он определяет типы объектов которые на нем находятся(все они наследники от QWidget) и по команде add добавляет внутри себя новый набор виджетов который является клоном того что положили в дизайнере.
Вот тут наглядно что я хочу получить(в упрощенном варианте). Основная проблема в определении типов всех дочерних виджетов виджета-контейнера. Понятно что надо работать с шаблонами c++ но как? Может кто может что подсказать? |
|
|
||
Litkevich Yuriy |
10.4.2009, 15:55
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Вот тут наглядно что я хочу получить(в упрощенном варианте). всё равно не понятно.и по команде add добавляет внутри себя новый набор виджетов который является клоном того что положили в дизайнере. особенно это, команда уже не в дизайнере, а в коде? полность повторить содержимое?Основная проблема в определении типов всех дочерних виджетов виджета-контейнера. вроде нет такой проблемы, Метаобъектная система позволяет определить класс от которого унаследовались и пр.
|
|
|
fantom |
10.4.2009, 15:57
Сообщение
#3
|
Студент Группа: Участник Сообщений: 47 Регистрация: 29.1.2009 Пользователь №: 515 Спасибо сказали: 1 раз(а) Репутация: 1 |
Ну фактически слот add который описан 1 раз в коде , он должнен быть универсальным и уметь клонировать тот элемент который мы положили в дизайнере.
|
|
|
Litkevich Yuriy |
10.4.2009, 16:03
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
fantom |
10.4.2009, 16:07
Сообщение
#5
|
Студент Группа: Участник Сообщений: 47 Регистрация: 29.1.2009 Пользователь №: 515 Спасибо сказали: 1 раз(а) Репутация: 1 |
По определению на этот элемент можно класть только 1 виджет(на нем могут быть дочерние виджеты). В идеале вообще запретить добавление нескольких виджетов - но это некритично пока. Вот этот виджет который мы положили и будет клонироваться, причем расположение клонов будет задаваться через QLayout.
|
|
|
kuler |
10.4.2009, 16:13
Сообщение
#6
|
Танцор диско Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: -1 |
шаблоны тут врядли причем, достаточно обычного switch
как то так |
|
|
Litkevich Yuriy |
10.4.2009, 16:15
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Так. Имеется в дизайнере mainForm (QWidget) для него устанавливается некий компоновщик, например, QVBoxLayout.
В компоновщик помещается один(!) виджет. Далее в коде ищем у mainForm единственного ребенка и запоминаем его. При срабатывании слота add клонируем ребенка и помещаем в компоновщик mainForm. Если я правильно понял, тогда в чём вопрос? |
|
|
fantom |
10.4.2009, 16:21
Сообщение
#8
|
Студент Группа: Участник Сообщений: 47 Регистрация: 29.1.2009 Пользователь №: 515 Спасибо сказали: 1 раз(а) Репутация: 1 |
Проблема в том что внутри того виджета который мы поместили могут быть какие то объекты, причем тип их заранее неизвестен, известно только что они наследуются от QWidget. Как технически клонировать виджет который содержит внутри себя другие объекты. Причем с полным соответствием типов. Вариант со свитчем не очень подходит, хочется как то универсально..
|
|
|
Litkevich Yuriy |
10.4.2009, 16:24
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Как технически клонировать виджет который содержит внутри себя другие объекты. Во, вот это и есть настаящая задачка.Пока чуть мимо нее, экскурс так сказать: Чтобы найти ребёнка пользуемся чем-нибудь типа QObject::findChildren(), вернет указатель на QObject, его лучше сразу привести к типу QWidget с помощью qobject_cast. В слоте add клонируем виджет (вот с этим нужно разобраться) Далее если тебе понадобится вызывать методв специфичные для данного виджета, то используем invokeMtod |
|
|
fantom |
10.4.2009, 16:28
Сообщение
#10
|
Студент Группа: Участник Сообщений: 47 Регистрация: 29.1.2009 Пользователь №: 515 Спасибо сказали: 1 раз(а) Репутация: 1 |
Да согласен. До этого тоже дошел. А вот как вызвать new с тем классом который нужно получить при поиске дочерних виджетов непонятно.
|
|
|
Текстовая версия | Сейчас: 20.11.2024, 2:54 |