crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Виджет-контейнер
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  


Цитата(fantom @ 10.4.2009, 19:45) *
Вот тут наглядно что я хочу получить(в упрощенном варианте).
всё равно не понятно.

Цитата(fantom @ 10.4.2009, 19:45) *
и по команде add добавляет внутри себя новый набор виджетов который является клоном того что положили в дизайнере.
особенно это, команда уже не в дизайнере, а в коде? полность повторить содержимое?

Цитата(fantom @ 10.4.2009, 19:45) *
Основная проблема в определении типов всех дочерних виджетов виджета-контейнера.
вроде нет такой проблемы, Метаобъектная система позволяет определить класс от которого унаследовались и пр.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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, 19:57) *
он должнен быть универсальным и уметь клонировать тот элемент который мы положили в дизайнере.
вот с этого места ещё подробнее.
Клонировать только тот элемент, который положили в дизайнере?
- - -> Если в дизайнере положили несколько элементов, то клонировать все?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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
if (child.type == QButton)
{
but = new QButton(child);
}
else if (child.type == QListWidget)

как то так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(fantom @ 10.4.2009, 20:21) *
Как технически клонировать виджет который содержит внутри себя другие объекты.
Во, вот это и есть настаящая задачка.

Пока чуть мимо нее, экскурс так сказать:
Чтобы найти ребёнка пользуемся чем-нибудь типа QObject::findChildren(), вернет указатель на QObject, его лучше сразу привести к типу QWidget с помощью qobject_cast.

В слоте add клонируем виджет (вот с этим нужно разобраться)

Далее если тебе понадобится вызывать методв специфичные для данного виджета, то используем invokeMtod
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 10.4.2009, 16:28
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 29.1.2009
Пользователь №: 515

Спасибо сказали: 1 раз(а)




Репутация:   1  


Да согласен. До этого тоже дошел. А вот как вызвать new с тем классом который нужно получить при поиске дочерних виджетов непонятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.11.2024, 2:54