Цитата(fantom @ 10.4.2009, 17:21)
Как технически клонировать виджет который содержит внутри себя другие объекты.
Цитата(fantom @ 10.4.2009, 16:45)
Работа с ним будет происходить примерно следующим образом: в дизайнере мы переносим мышкой необходимый виджет на виджет-контейнер
Отклонусь немного от темы (а мож и не отклонюсь
).
По двум недавным обсуждения по поводу динамического создания форм (
раз два) родилась следущая мысль. Не знаю на сколько хорошая, но право на жизнь имеющая. (Меня покрайней мере было интересно это реализовать).
Итак, вопросс
Цитата(fantom @ 10.4.2009, 17:21)
Как технически клонировать виджет который содержит внутри себя другие объекты.
Сразу хочу оговориться, с XML опыта работы очень мало, так что если есть способ сократить код или сделать более изящно, сделайте это. Мне прошу не пинать
И еще, метод
domxmlToString был позаимствован у xintrea здесь (
ссылка)
Итак, изначально форма, виджет-контейнер и все что в нем, создается в дисигнере. Т.е. мы имее ui файл.
// читаем содержимое 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;
}
// Преабразуем наш узел в QByteArray
QByteArray xmlstr = domxmlToString(elem).toUtf8();
// А теперь эмитируем XML файл (а если точнее .ui)
xmlstr.prepend("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<ui version=\"4.0\">");
xmlstr.append("</ui>");
// Загружае наш виджет-контейне(или если хотите клонируем) посредством 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;
}
}
Вот что получилось у меня(см. прикрепленные рисунки). Как видете я создал два клона части своего приложения, Все свойства при этом сохранены, в том числе и ресурсы.
Ух. Я в тему надеюсь
?
Даже если не совсем, хвалим меня, я старался