crossplatform.ru

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

> Виджет-контейнер
fantom
  опции профиля:
сообщение 10.4.2009, 15:45
Сообщение #1


Студент
*

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

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




Репутация:   1  


Возникла необходимость сделать виджет-контейнер. По сути это обычный виджет в котором могут находится другие виджеты вместе со своими дочерними виджетами. Работа с ним будет происходить примерно следующим образом: в дизайнере мы переносим мышкой необходимый виджет на виджет-контейнер, и он определяет типы объектов которые на нем находятся(все они наследники от QWidget) и по команде add добавляет внутри себя новый набор виджетов который является клоном того что положили в дизайнере.
Вот тут наглядно что я хочу получить(в упрощенном варианте).
Прикрепленное изображение

Основная проблема в определении типов всех дочерних виджетов виджета-контейнера. Понятно что надо работать с шаблонами c++ но как? Может кто может что подсказать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 10.4.2009, 22:50
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(fantom @ 10.4.2009, 17:21) *
Как технически клонировать виджет который содержит внутри себя другие объекты.
Цитата(fantom @ 10.4.2009, 16:45) *
Работа с ним будет происходить примерно следующим образом: в дизайнере мы переносим мышкой необходимый виджет на виджет-контейнер


Отклонусь немного от темы (а мож и не отклонюсь :) ).
По двум недавным обсуждения по поводу динамического создания форм (раз два) родилась следущая мысль. Не знаю на сколько хорошая, но право на жизнь имеющая. (Меня покрайней мере было интересно это реализовать).
Итак, вопросс
Цитата(fantom @ 10.4.2009, 17:21) *
Как технически клонировать виджет который содержит внутри себя другие объекты.

Сразу хочу оговориться, с XML опыта работы очень мало, так что если есть способ сократить код или сделать более изящно, сделайте это. Мне прошу не пинать :)
И еще, метод domxmlToString был позаимствован у xintrea здесь (ссылка)

Итак, изначально форма, виджет-контейнер и все что в нем, создается в дисигнере. Т.е. мы имее ui файл.
шаг №1
 // читаем содержимое ui файла
QDomDocument doc("mydocument");
QFile file("../form/oscilloscope.ui");
if (!file.open(QIODevice::ReadOnly))
     return 0;
if (!doc.setContent(&file)) {
     file.close();
     return 0;
}
file.close();

// отыскиваем в нем наш виджет контейнер по имени (в моем случае это voltdivgroupBox)
QDomNodeList nodelist = doc.elementsByTagName( "widget" );
QDomElement elem; // здесь будет сохранен нужный нам узел
qDebug() << nodelist.count();
for (int i =0; i != nodelist.count(); i++) {
     elem = nodelist.item(i).toElement();
     if(elem.attribute("name") == "voltdivgroupBox")
         break;
}

шаг №2
// Преабразуем наш узел в QByteArray
QByteArray xmlstr = domxmlToString(elem).toUtf8();
// А теперь эмитируем XML файл (а если точнее .ui)
xmlstr.prepend("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
           "<ui version=\"4.0\">");
xmlstr.append("</ui>");

шаг №3 (заключительный)
// Загружае наш виджет-контейне(или если хотите клонируем) посредством QUiLoader 
    QUiLoader loader;
    QBuffer buffer(&xmlstr);
    buffer.open(QIODevice::ReadOnly|QIODevice::Text);
    QWidget *myWidget = loader.load(&buffer); // это клон нашего виджета-контейнера со всеми расположенными в нем элементами и с сохраннеными свойствами
    buffer.close();
    myWidget->show();

приложение. Описание метода domxmlToString
QString domxmlToString(QDomNode xmldata)
{
     if(xmldata.isDocument()) {
         return xmldata.toDocument().toString();
     }
     else {
         QString xmlcode;
         QTextStream stream(&xmlcode, QIODevice::WriteOnly);
         xmldata.save(stream, 1);
         return xmlcode;
     }
}

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

Ух. Я в тему надеюсь :rolleyes:?
Даже если не совсем, хвалим меня, я старался :rolleyes:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- fantom   Виджет-контейнер   10.4.2009, 15:45
- - Litkevich Yuriy   Цитата(fantom @ 10.4.2009, 19:45) Вот тут...   10.4.2009, 15:55
- - fantom   Ну фактически слот add который описан 1 раз в коде...   10.4.2009, 15:57
- - Litkevich Yuriy   Цитата(fantom @ 10.4.2009, 19:57) он долж...   10.4.2009, 16:03
- - fantom   По определению на этот элемент можно класть только...   10.4.2009, 16:07
- - kuler   шаблоны тут врядли причем, достаточно обычного swi...   10.4.2009, 16:13
- - Litkevich Yuriy   Так. Имеется в дизайнере mainForm (QWidget) для не...   10.4.2009, 16:15
- - fantom   Проблема в том что внутри того виджета который мы ...   10.4.2009, 16:21
- - Litkevich Yuriy   Цитата(fantom @ 10.4.2009, 20:21) Как тех...   10.4.2009, 16:24
- - fantom   Да согласен. До этого тоже дошел. А вот как вызват...   10.4.2009, 16:28
- - Litkevich Yuriy   Первое, что приходит в голову по поводу клонирован...   10.4.2009, 16:38
- - fantom   QMetaObject::newInstance? Это в какой версии qt? У...   10.4.2009, 16:41
- - Litkevich Yuriy   Цитата(fantom @ 10.4.2009, 20:41) Ясно.. ...   10.4.2009, 16:43
- - SABROG   Сейчас речь идет о стандартных виджетах Qt или о с...   10.4.2009, 16:48
- - Litkevich Yuriy   Цитата(SABROG @ 10.4.2009, 20:48) Сейчас ...   10.4.2009, 16:49
- - fantom   Вообще у меня задача стоит клонировать и мои собст...   10.4.2009, 17:09
- - igor_bogomolov   Цитата(fantom @ 10.4.2009, 17:21) Как тех...   10.4.2009, 22:50
- - Litkevich Yuriy   igor_bogomolov, вся эта процедура нужна для того, ...   10.4.2009, 23:01
- - igor_bogomolov   Цитата(Litkevich Yuriy @ 11.4.2009, 0:01)...   10.4.2009, 23:14
- - igor_bogomolov   Цитата(SABROG @ 10.4.2009, 17:48) возможн...   11.4.2009, 0:52
|- - SABROG   Цитата(igor_bogomolov @ 11.4.2009, 1:52) ...   11.4.2009, 8:19
- - fantom   igor_bogomolov спасибо за решение проблемы. Как я ...   13.4.2009, 9:56
- - fantom   Еще вопрос. Каким образом при такой схеме обращать...   13.4.2009, 10:46
- - igor_bogomolov   Я лишь предложил способ как клонировать часть Gui....   13.4.2009, 11:20
- - fantom   Все разобрался. Используя findChildren<QWidget*...   13.4.2009, 11:32


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


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




RSS Текстовая версия Сейчас: 2.10.2024, 23:30