Russian Qt Forum
Май 04, 2024, 05:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 46 47 [48] 49 50
706  Qt / Пользовательский интерфейс (GUI) / QAction и вызов слота с параметром. Как сделать? : Август 24, 2008, 22:25
Здравствуйте!


Мне нужно сделать таку вещь - создать контекстное меню (на виджете QListView) и вызывать один и тот же слот с разными параметрами. Ну то есть хотелось бы вместо создания отдельного слота на каждый пункт меню, иметь "общие" слоты, которые вызываются с параметром.

Ниже дан код (нерабочий), и хотелось бы понять, как сделать его рабочим.

Код:
  // Обычное добавление записи в конец списка
  a = new QAction(tr("Add new"), this);
  connect(a, SIGNAL(triggered()),
            this,SLOT(recordview_add_new_context(ADD_NEW_RECORD_TO_END)));
  menu.addAction(a);

  // Добавление записи до
  a = new QAction(tr("Add new before"), this);
  if((!recordview->selectionModel()->hasSelection()) ||
     (recordview->selectionModel()->selectedRows()).size()!=1 )
   a->setEnabled(false); // Пункт активен только если выбрана одна строка списка
  connect(a, SIGNAL(triggered()),
            this,SLOT(recordview_add_new_context(ADD_NEW_RECORD_BEFORE)));
  menu.addAction(a);
707  Qt / Общие вопросы / Re: Тормозит иерархическая модель построенная на QAbstractItemModel : Август 21, 2008, 22:40
Цитировать
Так у меня так и делается но так надо потом (после удаления) сообщить об этом представлению (TreeView в данном случае) перерисоваться если вызывать reset то это слишком наклодно, поэтому я вызываю emit dataChanged ток не знаю индексы какие?

Я так понял, что вместо сигналов при добавлении/удалении лучше пользоваться конструкциями beginInsertRows(), endInsertRows() и т.д.

Вот пример - у меня внутреннее представление списка, унаследованного от  QAbstractListModel, лежит в списке QList<QString> table. Когда я добавляю в конец списка новую запись, я делаю таг

Код:
  // Начинаются добавляться данные
  beginInsertRows(QModelIndex(), table.size(), table.size() + 1);

  // Новая запись размещается в списке
  table << tmpline;

  // Добавление данных закончено, далее вид должен сам знает что надо
  // обновить на экране чтоб была видно новая строка
  endInsertRows();

А когда удаляю запись, делаю таг (i - 'это номер записи которую надо удалить)

Код:
 // Начинается удаление записи
 beginRemoveRows(QModelIndex(),i,i);

 // Удаляется элемент
 table.takeAt(i);

 // Удаление записи закончено
 endRemoveRows();

То есть идея такая - указываем какая область меняется, потом эти области будут автоматом перерисованы видом. Так как это будет происходить с вызовом метода data(), который в моем случае из внутреннего представления (из списка table) возвращает запрошенный элемент, то вид как раз и обновится в соответсвии с изменениями, вносимыми в внутренне представление даннх.
708  Qt / Общие вопросы / Re: Где можно заработать используя QT : Август 21, 2008, 22:01
PS: я используя QT получал где-то около 700% около года назад, щас малость его забросил - ибо больше нравится консольные проги делать под Linux.

Кто ваш заказчик? Ну не обязательно говорить конкретно контору, но всеже хотелось бы узнать, кому ныне нужны консольные проги под Linux, и где такие заказчики водятся? А реально ли с такими заказчиками удаленно работать?
709  Qt / XML / Re: Не могу сделать простую вещь - добавить подэлемент в дерево. : Август 17, 2008, 12:02
Да, помогло две вещи.

1. Создавать валидный документ с указанием DOCTYPE,

т. е. вместо
Код:
QDomDocument doc();
писать
Код:
QDomDocument doc("doc");


2. Прилеплять ветку без глубокого копирования,

т. е. вместо
Код:
elm.appendChild(formvers.cloneNode());
писать
Код:
elm.appendChild(formvers);
710  Qt / XML / Не могу сделать простую вещь - добавить подэлемент в дерево. : Август 16, 2008, 23:59
Здравствуйте!


Вторые сутки бъюсь на простой проблемой. Кратко задача такая.

Есть QDomElement, содержащий некоторое DOM дерево. Надо - добавить в него один элемент (на первый уровень вложения), приклеить получившийся элемент к пустому документу, и сохранить документ в файл. Вот болванка, дальше мы бодем изменять в ней один блок кода

Код:
 // Коструирование DOM документа для записи в файл
 QDomDocument doc;

 // Установка заголовка
 doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""));

 // Получение DOM дерева хранимых данных (это моя функция, рабочая)
 QDomElement elm=nodemodel->export_fullmodeldata_to_dom(nodemodel->rootItem);

 // Добавление формата версии к элементу хранящему DOM дерево хранимых данных
 QDomElement formvers=doc.createElement("format");
 formvers.setAttribute("version",CURRENT_FORMAT_VERSION);
 formvers.setAttribute("subversion",CURRENT_FORMAT_SUBVERSION);
 elm.appendChild(formvers.cloneNode());

 // Добавление дерева DOM хранимых данных к документу
 doc.appendChild(elm);

 qDebug() << "Doc document for write " << doc.toString();

 // Запись DOM данных в файл
 QString filename="temp.xml";
 QFile wfile(filename);
 if (!wfile.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << "Cant open file ";exit(1);}
 QTextStream out(&wfile);
 out.setCodec("UTF-8");
 out << doc.toString();

В результате мы имеем

Код:
Doc document for write  "<?xml version="1.0" encoding="UTF-8"?>
<content>
 </node>
   <record dir="0000000100" id="49" name="Тушканчик" file="text.txt" />
 </node>
 <format version="1" subversion="1" />
</content>
"
*** glibc detected *** ./mytetra: corrupted double-linked list: 0x087e6aa8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb73d8b2a]
/lib/tls/i686/cmov/libc.so.6[0xb73dae38]
/lib/tls/i686/cmov/libc.so.6[0xb73dbef5]
/lib/tls/i686/cmov/libc.so.6(realloc+0xfe)[0xb73de08e]
/usr/lib/libQtCore.so.4(_Z8qReallocPvj+0x24)[0xb7621c38]
/usr/lib/libQtCore.so.4(_ZN9QListData7reallocEi+0x68)[0xb7647bc0]
/usr/lib/libQtCore.so.4(_ZN9QListData6appendERKS_+0xc1)[0xb7647e6f]
/usr/lib/libQtGui.so.4[0xb78a7c5c]
/usr/lib/libQtGui.so.4(_ZN12QApplication10allWidgetsEv+0x98)[0xb789ed68]
/usr/lib/libQtGui.so.4(_ZN12QApplication15topLevelWidgetsEv+0x28)[0xb789eda6]
/usr/lib/libQtGui.so.4(_ZN19QApplicationPrivate26_q_tryEmitLastWindowClosedEv+0x26)[0xb789ee8c]
/usr/lib/libQtGui.so.4(_ZN12QApplication11qt_metacallEN11QMetaObject4CallEiPPv+0x114)[0xb78a145e]
/usr/lib/libQtCore.so.4(_ZN14QMetaCallEvent13placeMetaCallEP7QObject+0x34)[0xb76ed588]
/usr/lib/libQtCore.so.4(_ZN7QObject5eventEP6QEvent+0x13f)[0xb76f28ef]
/usr/lib/libQtCore.so.4(_ZN16QCoreApplication5eventEP6QEvent+0x47)[0xb76df84b]
Aborted (core dumped)4(_Z


Если закомментировать код

Код:
 // Добавление формата версии к элементу хранящему DOM дерево хранимых данных
 QDomElement formvers=doc.createElement("format");
 formvers.setAttribute("version",CURRENT_FORMAT_VERSION);
 formvers.setAttribute("subversion",CURRENT_FORMAT_SUBVERSION);
 elm.appendChild(formvers.cloneNode());

То ошибки не возникает. Логично предполагаю, что проблема в этом куске кода, что-то там добавляется некорректно.

Начинаю экспериментировать. Пробую так

Код:
// Добавление формата версии к элементу хранящему DOM дерево хранимых данных
 QDomElement formvers=another.createElement("format"); // Элемент на основе временного документа
 formvers.setAttribute("version",CURRENT_FORMAT_VERSION);
 formvers.setAttribute("subversion",CURRENT_FORMAT_SUBVERSION);
 elm.appendChild(formvers.cloneNode());

Ошибки нет, но узел <format version="1" subversion="1" /> не появляется. Пробовал еще по-разному. Результат один и тот же - ошибки нет, но узла <format version="1" subversion="1" /> тоже нет. Вот еще как пробовал

Код:
// Добавление формата версии к элементу хранящему DOM дерево хранимых данных
 QDomElement formvers;
 formvers.setTagName("format");
 formvers.setAttribute("version",CURRENT_FORMAT_VERSION);
 formvers.setAttribute("subversion",CURRENT_FORMAT_SUBVERSION);
 elm.appendChild(formvers.cloneNode());

И еще пробовал варианты кода без cloneNode() в последней строке. Ничего не помогает - ошибки нет, но и узла <format version="1" subversion="1" /> тоже нет.


Я уже не знаю что делать. На просторах интернета ничего внятного не нашел. Кроме того, что подобная ошибка происходит в режиме компиляции C++ (не в чистом C). На русских ресурсах такую ошибку видел только один человек. У боржуев - ошибка популярна, возникает в GTK+, в каких-то HTML-парсерах, в Qt. Но с моим знанием англицкого понять что к чему весьма трудно.


Вопрос - что делать то? Задачка ведь простая, но такие сложности выше моего понимания. Кто что может сказать, возможно у когото есть подобный опыт.
711  Qt / XML / Re: XML. Три вопроса. (Решено) : Август 15, 2008, 20:53
Ну как бы в описании метода toString() не указывается, что для преобразования в строку документа, DOM-представление обязательно должно быть валидным.

Кусок из русской доки, арфаграфия аффтарская

Цитировать
QString QDomDocument::toString ( int indent = 1 ) const

Переводет анализируемый документ обратно в его текстовое представление.
Эта фукнция использует indent для определения объема пространства отступа для подэлементов.



Меня больше беспокоит другое.

1. Что же действительно присходит при выполнении кода вида

Код:
QDomDocument doc;
QDomElement elm = doc.createElement("element");
?

Почему на документ doc происходит влияние через createElement(), и он уже не является null node, хотя все так же ничего не содержит?

Почему у троллей в документации вышеприведенный код повторяется как мантра? Потому что они знают об этой особенности. Но по неизвестным причинам не описывают подробностей.


2. В связи с вышенаписанным, не получится ли так, что в новой подверсии Qt такое поведение будет изменено? Например, doc.createElement("element") перестанет влиять на документ doc, и doc будет оставаться в виде null node? И тогда весь код, который был написан со знанием этой особенности станет невалидным?

712  Qt / XML / Re: XML. Три вопроса. : Август 15, 2008, 18:14
если спросил, _слушай_ ответ, а?
итак, ещё раз:
1., 2.
Код:
QDomDocument doc;
 QDomElement elm=doc.createElement("content"); // - "оторванная" ветка
 doc.appendChild(elm); // - нормальная ветка
 qDebug() << "New element " << xmlnode_to_string(elm);

Хмм... Что в ^^^этом куске кода является _ответом_?


В любом случае, проблема оказалась не в "оторваных" и "нормальных" ветках. А в особенности инициализации документа. Оказывается, документ, который создается командой типа QDomDocument tempdoc, является при создании пустым, и к нему невозможно прикрепить ни "оторванную", ни "нормальную" ветку.

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

Пояснения на примере

Код:
 // Так НЕ работает
 qDebug() << "\n It is NOT work";
 QDomDocument doca1;
 QDomElement elma=doca1.createElement("content"); // Создаем элемент
 QDomDocument doca2; //
 doca2.appendChild(elma); // Прикрепляем элемент к ПУСТОМУ документу
 qDebug() << "Document a2 " << doca2.toString();

 // Так работает
 qDebug() << "\n It is work";
 QDomDocument docb1;
 QDomElement elmb=docb1.createElement("content"); // Создаем элемент
 QDomDocument docb2("debugdoc");
 docb2.appendChild(elmb); // Прикрепляем элемент к НЕПУСТОМУ документу (т.к. при создании был передан DOCTYPE "debugdoc")
 qDebug() << "Document b2 " << docb2.toString();

 // Так работает
 qDebug() << "\n It is work";
 QDomDocument docc;
 QDomElement elmc=docc.createElement("content"); // Создаем элемент
 docc.appendChild(elmc); // Прикрепляем элемент к ПУСТОМУ документу, но элемент был создан через createElement() данного документа
 qDebug() << "Document c " << docc.toString();

Результат выполнения этого кода такой

Код:
 It is NOT work
Calling appendChild() on a null node does nothing.
Document a2  ""

 It is work
Document b2  "<!DOCTYPE debugdoc>
<content/>"

 It is work
Document c  "<content/>"

Подумав и поэкспериментировав еще немного, начинаешь понимать, что третий вариант кода трактуется выше по тексту неправильно. Не обязательно "прикрепляемая ветка должна быть создана через метод createElement() именно этого же документа". Происходит кое-что другое. А происходит вот что - при вызове метода createElement(), несмотря на то, что создаваемый элемент является "оторванным" и существует "сам по себе", документ, у которого был вызван createElement(), перестает быть нулевым.

Проверим это на примере

Код:
 // Так работает
 qDebug() << "\n It is  work";
 QDomDocument doc1;
 QDomElement elm1=doc1.createElement("content"); // Создаем элемент
 QDomDocument doc2; //
 QDomElement elm2=doc2.createElement("stub"); // Создаем элемент-вспомогалку, который является "оторванным", но создание которого повлияло на doc2 и сделало doc2 НЕПУСТЫМ
 doc2.appendChild(elm1); // Прикрепляем элемент к ТИПА_ПУСТОМУ документу
 qDebug() << "Document " << doc2.toString();

Результат выполнения этого кода

Код:
 It is  work
Document  "<content/>"


Собирая все в кучу, понимаем как можно сделать дебаговый вывод (любого "оторванного" или там "неоторванного") элемента.

Вначале у нас была функция, которая тупо не выводила содержимого узлов. Не потому что узлы были "оторваны" или "неоторваны", а просто - она не выводила содержимого узлов вообще. Как теперь выясняется, проблемы была в том, что документ tempdoc нуливой, и к нему ветка прицепиться не может. Напоминаю код

Код:
QString xmlnode_to_string(QDomNode xmldata)
{
 QDomDocument tempdoc;

 if(!xmldata.isNull())
  {
   tempdoc.appendChild(xmldata.cloneNode());
   return tempdoc.toString();
  }
 else return "";
}

Какую бы ветку в эту функцию не скармливай, результат будет такой

Код:
Calling appendChild() on a null node does nothing.
""


Попробуем модифицировать эту функцию, и просто заменим строку QDomDocument tempdoc; на  QDomDocument tempdoc("debugdoc");. В результате, какую бы ветку мы не передали, "оторванную" или "неоторванную", ее содержимое мы увидем, но не в совсем нужной для нас форме. Код

Код:
 QDomElement elm=doc.createElement("content"); // - "оторванная" ветка
 qDebug() << "New element " << xmlnode_to_string(elm);

Покажет вот что

Код:
New element  "<!DOCTYPE debugdoc>
<content/>"

Узел <!DOCTYPE debugdoc> явно мешает. Тогда приводим функцию вот к такому виду

Код:
QString xmlnode_to_string(QDomNode xmldata)
{
 QDomDocument tempdoc;

 // Создаем элемент-вспомогалку, который нигде не используется, но создание которого
 // влияет на tempdoc, делая этот докумен ненулевым
 QDomElement tempelm=tempdoc.createElement("stub");

 if(!xmldata.isNull())
  {
   tempdoc.appendChild(xmldata.cloneNode());
   return tempdoc.toString();
  }
 else return "";
}

И такая функция при вызове кода

Код:
 QDomElement elm=doc.createElement("content"); // - "оторванная" ветка
 qDebug() << "New element " << xmlnode_to_string(elm);

Покажет то что нужно

Код:
New element  "<content/>"


3. createProcessingInstruction создаёт не документ, а ветку! как и в 1-2 - если ты не прикрепил ветку к документу, ветки нет - она оторвана, а оторванные ветки не имеют отношения к документу, а посему невалидны. а раз невалидны, то и не дебажатся

Как видно, дебажатся.


4. приведи ссылку на хорошие доки по хмл в том же ас или вб. если без примерчика 2 + 2 = 4 в голове ничего не проясняется, не лезь в плюсы

Ссылка http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/, ознакомьтесь краем глаза. А вообще хорошие доки по XML в составе документации на язык программирования или библиотеку ненужны. Ненадо путать понятия. В документации на язык программирования или библиотеку должны быть хорошо задокументированы функции работы с XML. А это в Qt доке сделано недостаточно полно. Заметте, про ms ни слова. И не пугайте неофитов плюсами, мне то пофигу, а есть такие люди которые отвернутся от плюсов и Qt только потому, что им Константин посоветовал не лезть.
713  Qt / XML / Re: XML. Три вопроса. : Август 15, 2008, 14:23
через toString ты получаешь документ обработанный хмл процессором т.е. результат:
Код:
  QString xmlstr = "<?xml version=\"1.0\"?><!DOCTYPE letter [<!ENTITY title \"title text\">]>\
   <letter>&title;</letter>";
 
  QDomDocument doc;
  doc.setContent(xmlstr, true);
 
  qDebug() << doc.toString();
выведет:
Код:
<?xml version='1.0'?>
<!DOCTYPE letter>
<letter>title text</letter>

Спасибо, конечно.. А как это относится к вопросам выше?
714  Qt / XML / Re: XML. Три вопроса. : Август 15, 2008, 13:14
1. дом всегда зависит от спецификации документа - "оторванные" ветки _нельзя_ дэбажить - читай документацию

То есть, настоящие гуру XML-ветки не дебажат, потому что нельзя? Ну так в приведеном примере, "оторваная" ветка прикрепляется с глубоким копированием к документу. Документ вроде как можно дебажить через метод toString(). Почему документ получается пустой? Что сделать чтоб в документе появлялась прикрепляемая к нему ветка?


1.1. в qt работа с дом реализована _очень_ близко к требованиям спецификации хмл дом - читай спецификацию хмл дом
2. doc.appendChild(elm)  - читай документацию

Вот я читаю документацию, и нихрена не понимаю, что присходит при выполнении кода

QDomElement elm=doc.createElement("content");

По идее, должен создаться XML-элемент с именем content. Я его (а точнее его копию, ибо передача по значению) скармливаю в дебажную функцию xmlnode_to_string(), в ней переданый элемент прикрепляется к временному документу (причем с глубоким копированием). И содержимое этого временного документа выводится на экран. Однако, вопреки ожиданию увидеть "<content/>", вижу пустую строку. В каком месте рассуждений ошибка?

Да, делать doc.appendChild(elm) мне не нужно. Я хочу только понять, как дебажить/клеить элементы/ноды, пускай и "оторванные". Это нужно понять, само собой, не только для дебага.


3. doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""))  - читай документацию

Угу, вместо

doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");

надо было писать

doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""))

Тока как-то неестественно запихивать документ в документ. Ведь XML-документ состоит из XML-элементов, а не из XML-документов.


читай документацию

Мда, троллям еще над документацией надо работать и работать. Сейчас она больше похожа на линуховые маны, в которых минимальными словами описаны опции и больше ничего. До уровня доков Adobe по ActionScript, или там доков Microsoft по VisualBasic, или даже до доки в досовом Борланд C, в которых практически на каждую функцию сделан пример, дока Qt не дотягивает. Хорошо хоть в начале разделов дают небольшие примеры, без них бы Qt был вообще неизучаем. А без примеров в две-три строки на каждую описываемую функцию, пионерам сложно.
715  Qt / XML / XML. Три вопроса. (Решено) : Август 14, 2008, 22:49
Здравствуйте!


Пытаюсь генерить через Qt (DOM модель) XML-файлы, и есть несколько вопросов. Я с XML только во флшевом ActionScript работал, там как-то все просто и сразу работает, видимо из-за динамической типизации. А в Qt что-то осилить не могу..


Вопрос 1. Кто чем пользуется для отладочного вывода в виде XML кода содержимого QDomNode, QDomElement, QDomDocument?

Я себе накорябал такую функцию, но она меня не устраивает, во-первых потому что может выводить только QDomNode и QDomElement, во-вторых потому что как-то странно выполняет свои функции.

Код:
QString xmlnode_to_string(QDomNode xmldata)
{
 QDomDocument tempdoc;

 if(!xmldata.isNull())
  {
   tempdoc.appendChild(xmldata.cloneNode());
   return tempdoc.toString();
  }
 else return "";
}

А странность вот какая. Если выполнить код

Код:
 QDomDocument doc;
 QDomElement elm=doc.createElement("content");
 qDebug() << "New element " << xmlnode_to_string(elm);

то вместо ожидаемого "<content/>" мы видим пустую строку.

Вопрос 2. Почему вместо "<content/>" вышеприведенный код выдает пустую строку?

Ну и еще.

Вопрос 3. Вот простой код


Код:
 // Коструирование DOM документа для записи в файл
 QDomDocument doc;

 // Установка заголовка
 doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");

 // Установка формата версии
 QDomElement formvers=doc.createElement("format");
 formvers.setAttribute("version",1);
 formvers.setAttribute("subversion",1);
 doc.appendChild(formvers);

 qDebug() << "Doc document for write " << doc.toString();

 // Запись DOM данных в файл
 QString filename="file.xml";
 QFile wfile(filename);
 if (!wfile.open(QIODevice::WriteOnly | QIODevice::Text))
  {
   qDebug() << "Cant open file " << filename << " for write.";
   exit(1);
  }
 QTextStream out(&wfile);
 out.setCodec("UTF-8");
 out << doc.toString();

При его выполнении получаю файл с содержимым

<format version="1" subversion="1" />

а должен получиться файл

<?xml version="1.0" encoding="UTF-8"?>
<format version="1" subversion="1" />


почему генерируется файл без заголовка?
716  Qt / XML / Re: Ступор. Перебор одноуровненых элементов в документе. : Август 01, 2008, 10:22
Таки да, cloneNode() помогло...

Но факт остается фактом - в коде

Код:
 QDomDocument t("t");
 t.appendChild(e);
 qDebug() << "Element " << t.toString();

нет и упоминания об объекте n, который в результате "мигрировал с одного документа в другой". Максимум что есть - передача производного объекта e в функцию appendChild(), причем передача по значению, а не по ссылке. А если идет передача по значению, объект e меняться не должен. В результате работы данного кода только объект t должен измениться и начать указывать своим узлом на временный оъект e. А объект n тут вообще не затрагивается.

В какой момент происходит миграция объекта n с одного документа в другой?

Блин, я уже боюсь пользоваться Qt с такими залипухами... Вместо работы с грабли на граблю наступаю.
717  Qt / XML / Ступор. Перебор одноуровненых элементов в документе. : Июль 31, 2008, 23:18
Здравствуйте!


Все время, для дебажного просмотра содержимого элемента в XML-виде, я пользовался такой конструкцией.

Код:
 // e - это QDomElement
 QDomDocument t("t");
 t.appendChild(e);
 qDebug() << "Element " << t.toString();

Но вот третий день долбался с одной простой задачей, и никак не мог понять почему не работает... В конце концов нашел глюк, но почему он происходит - понять не могу.

Задачка: имеем документ с одноуровневыми элементами. В XML формате он записывается так

Код:
<element_1/>
<element_2/>
<element_3/>

Мне его нужно обежать и вывести имена всех элементов на экран. 

Вот нормально работающий код

Код:
 // Конструируем документ
 QDomDocument rectab;

 QDomElement e1=rectab.createElement("element_1");
 rectab.appendChild(e1);
 QDomElement e2=rectab.createElement("element_2");
 rectab.appendChild(e2);
 QDomElement e3=rectab.createElement("element_3");
 rectab.appendChild(e3);

 // Проверяем что получилось
 qDebug() << "Rectab " << rectab.toString();

 // Обегаем все элементы
 QDomNode n = rectab.firstChild();
 while(!n.isNull())
  {
   QDomElement e = n.toElement(); // пробуем преобразовать узел в элемент.
   if(!e.isNull())
    {
     qDebug() << "Element " << e.tagName(); // выводим имя узла
    }
   n = n.nextSibling();
  }

Он реально пробегает по всем элементам, и выводит их названия

Код:
Rectab  "<element_1/>
<element_2/>
<element_3/>
"
Element  "element_1"
Element  "element_2"
Element  "element_3"

А вот неправильно работающий цикл (стрелками показаны строчки которые были изменены относительно предыдущего примера кода)

Код:
 // Обегаем все элементы
 QDomNode n = rectab.firstChild();
 while(!n.isNull())
  {
   QDomElement e = n.toElement(); // пробуем преобразовать узел в элемент.
   if(!e.isNull())
    {
->    QDomDocument t("t");
->    t.appendChild(e);
->    qDebug() << "Element " << t.toString(); // Выводим элемент на экран
    }
   n = n.nextSibling();
  }

Который обегает только первый элемент

Код:
Rectab  "<element_1/>
<element_2/>
<element_3/>
"
Element  "<!DOCTYPE t>
<element_1/>"

То есть, элемент 2 и 3 не видится.

Почему так происходит? По какой причине узел n теряет связи со своими последующими узлами в этом случае? Я n при выводе вообще не трогаю, использую временный объект t, в который вставляю временный объект e (делаю это чтоб увидеть XML-код). Почему же данный цикл не работает?
718  Qt / Пользовательский интерфейс (GUI) / Re: Передача данных из модального окна в основное через слот. Неполучается. : Июль 23, 2008, 15:11
переменная окна видна только в теле функции
если вы хотите этого избежать - делайте все через new/delete

Не понял... Память от окна освободится в вышеприведенном коде? При постоянном открытии-закрытии окна добавления записи не будет ли утечки памяти?
719  Qt / Пользовательский интерфейс (GUI) / Re: Передача данных из модального окна в основное через слот. Неполучается. : Июль 23, 2008, 14:41
void mainwindow::recordview_add_new_context(void)
{
    qDebug() << "In slot recordview_add_new_context()";

    addnewrecord addnewrecordwin;
    int ret = addnewrecordwin.exec();
    if (ret == QDialog::Rejected) return;

    recordview_add_new(addnewrecord.recordName(), addnewrecord.recordValue());
}

А во такой вопрос волнует... Данное окно удалится при выходе из этой функции? Вроде должно удалиться, ведь происходит выход из области видимости, а тип окна не static. Но хотелоь бы уточнить, а то тут в форуме натыкаюсь на споры удаляется окно или только скрывается.
720  Qt / Пользовательский интерфейс (GUI) / Re: Передача данных из модального окна в основное через слот. Неполучается. : Июль 23, 2008, 14:14
Note that the signal and slots parameters must not contain any variable names, only the type.

Ага, в этом и было дело. Постоянно путаюсь, надо или нет указывать имена параметров. Потому что если описывать слот вот так

Код:
void recordview_select(const QModelIndex &index);

то имя параметра указывать можно.


Оказывается, имя указывать ненужно. Даже если строки в скобках в прототипе, реализации и в связке connect() будут одинаковыми, connect() не сможет создать соединение. В общем, при написании connect() имена указывать ненужно.
Страниц: 1 ... 46 47 [48] 49 50

Страница сгенерирована за 0.067 секунд. Запросов: 23.