crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Виджет-контейнер
Litkevich Yuriy
  опции профиля:
сообщение 10.4.2009, 16:38
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Первое, что приходит в голову по поводу клонирования - пробежатся по всем дочерним виджетам, однако надо будет еще и их свойства скопировать.

Цитата(fantom @ 10.4.2009, 20:21) *
Причем с полным соответствием типов
похоже, что роботёнки будет навалом.

Цитата(fantom @ 10.4.2009, 20:28) *
А вот как вызвать new с тем классом который нужно получить
можно поглядеть в сторону QMetaObject::newInstance
Но я тоже с такой задачкой не сталкивался, посему могу гененрить идеи и только ;)

Цитата
This function was introduced in Qt 4.5.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 10.4.2009, 16:41
Сообщение #12


Студент
*

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

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




Репутация:   1  


QMetaObject::newInstance? Это в какой версии qt? У меня в доках по 4,4,2 нет.

Ясно.. А мне кровь из носа не выше 4,4,2 можно использовать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.4.2009, 16:43
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(fantom @ 10.4.2009, 20:41) *
Ясно.. А мне кровь из носа не выше 4,4,2 можно использовать
тогда у меня никаких других идей нет, кроме как смотреть устройство QUiLoader'а
Ведь он как-то конструирует целую пачку объектов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 10.4.2009, 16:48
Сообщение #14


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Сейчас речь идет о стандартных виджетах Qt или о самопальных тоже из каких-нибудь плагинов? Например интересует вопрос, возможно ли скопировать окно типа QMainWindow? Насколько я знаю, в программе должен существовать только один экземпляр этого класса (singleton?).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.4.2009, 16:49
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 10.4.2009, 20:48) *
Сейчас речь идет о стандартных виджетах Qt
пока о них.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fantom
  опции профиля:
сообщение 10.4.2009, 17:09
Сообщение #16


Студент
*

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

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




Репутация:   1  


Вообще у меня задача стоит клонировать и мои собственные виджеты, которые сделаны как плагины дизайнера.

Впринципе т,к, виджетов не очень много можно сделать case. Но этого бы очень не хотелось бы.

Появилась одна идея,, Но для этого нужно будет переопределять все элементы которые необходимо клонировать. Как то так..
class MyClass: public QWidget
{
MyClass(QWidget* parent)
    QWidget* clone(QWidget* parent)
    {
        return MyClass( parent );
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.4.2009, 22:50
Сообщение #17


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

Группа: Сомодератор
Сообщений: 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:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.4.2009, 23:01
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


igor_bogomolov, вся эта процедура нужна для того, чтобы извлечь только нужный виджет из ui-файла, я правильно понял?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 10.4.2009, 23:14
Сообщение #19


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

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

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




Репутация:   29  


Цитата(Litkevich Yuriy @ 11.4.2009, 0:01) *
igor_bogomolov, вся эта процедура нужна для того, чтобы извлечь только нужный виджет из ui-файла, я правильно понял?
Нужный виджет, со всем его содержимым(т.е. расположенными на нем другими виджетами) и с сохранением его свойств, и свойств элементов на нем расположенных.
И сделать столько копий подобного объекта, сколько потребуеься. В общем на прилогаемом выше рисунке все видно. :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 11.4.2009, 0:52
Сообщение #20


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

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

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




Репутация:   29  


Цитата(SABROG @ 10.4.2009, 17:48) *
возможно ли скопировать окно типа QMainWindow? Насколько я знаю, в программе должен существовать только один экземпляр этого класса (singleton?).
Откуда такая информация? У меня в проекте используется два QMainWindow, и никаких проблем не испытываю :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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