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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextTable - задать ID ?  (Прочитано 9395 раз)
masha
Гость
« : Июль 31, 2009, 10:11 »


 Может кто-нибудь знает, возможно ли для QTextTable задать ID или класс, что-нибудь, чтобы потом эти таблицы различались в Html представлении?
Записан
registrationfedser87
Гость
« Ответ #1 : Июль 31, 2009, 12:27 »

Быть может это?
Код
C++ (Qt)
void QTextFormat::setObjectIndex ( int index )
А формат установишь через
Код
C++ (Qt)
void setFormat ( const QTextFormat & format )
« Последнее редактирование: Июль 31, 2009, 12:33 от fedser87 » Записан
masha
Гость
« Ответ #2 : Июль 31, 2009, 14:15 »

Попробовала, невышло, никаких изменений в html-коде.
Правда, взяла QTextTableFormat:
                      QTextTableFormat tableFormat;
      tableFormat.setObjectIndex(ind);
      QTextTable* table = cursor.insertTable(2, 2, tableFormat);
Просто, я документ потом разбираю не как объектную модель (тогда setObjectIndex() помог бы), а через QDomDocument.
Записан
registrationfedser87
Гость
« Ответ #3 : Август 03, 2009, 12:08 »

Криво конечно, но может тогда в заголовок таблицы добавлять свою инфу, а при построении удалять. Т.е. когда сохраняешь документ ты id объекта записываешь в заголовок, когда загружаешь ты читаешь и удаляешь этот id из заголовка.
Записан
masha
Гость
« Ответ #4 : Август 03, 2009, 14:47 »

Что-то не то.
Я ведь html документ получаю примерно так:

QString strHtmlDoc = textEdit->toHtml();  //здесь надо, чтобы таблицы отличались
QDomDocument doc;
doc.setContent(strHtmlDoc);
parser(doc);

Видимо никак. Ну ладно, так как эти таблицы поразному создаются, они всё-таки у меня атрибутами отличаются:
<table border="1" align="center" cellspacing="2">
<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="2" cellpadding="5">

от этого и придется плясать.
Записан
registrationfedser87
Гость
« Ответ #5 : Август 03, 2009, 15:02 »

parser()-твоя функция? ты ведь можешь прежде чем сохранять в strHtmlDoc пробежатся по всем таблицам и добавить например в конец таблицы строку с id. А при парсинге уже учитывать что последняя строка таблицы-это её id.
Вот пример "прохода" по таблицам:
Код
C++ (Qt)
QTextDocument *copyDocument = originalDocument->clone();
QTextCursor cursor(copyDocument);
QTextFrame *rootFrame = copyDocument->rootFrame();
ProcessFrame(rootFrame, cursor, copyDocument);
QString str = copyDocument->toHtml("UTF-8");
delete copyDocument;
 

Код
C++ (Qt)
void ProcessFrame(QTextFrame *frame, QTextCursor &cursor, QTextDocument *doc)
{
      QTextFrame::iterator it;
for (it = frame->begin(); !(it.atEnd()); ++it)
{
QTextFrame *childFrame = it.currentFrame();
QTextBlock childBlock = it.currentBlock();
 
if (childFrame)
{
QTextTable *childTable = qobject_cast<QTextTable*>(childFrame);
if (childTable)
ProcessTable(childTable, cursor, doc);
else
ProcessFrame(childFrame, cursor, doc);
}
      }
}
 
« Последнее редактирование: Август 03, 2009, 15:04 от fedser87 » Записан
spectre71
Гость
« Ответ #6 : Август 04, 2009, 09:35 »

Можно примерно так:

Код
C++ (Qt)
QTextTable* table = cursor.insertTable();
table->setProperty("MyTableId", int);
...
...
...
QString strHtmlDoc = textEdit->toHtml();
QDomDocument XmlDoc;
QDomDocument NewXmlDoc;
XmlDoc.setContent(strHtmlDoc);      
doFrame(textEdit->document()->rootFrame());
 
 
void doFrame(QTextFrame* frame) {
 QTextTable* table = qobject_cast<QTextTable*>(frame);
 if(table) {
   updateXml(table);
 }
 
 QList<QTextFrame*> FrameList = childFrames();
 foreach (QTextFrame* f) {
   doFrame(f);
 }
}
 
void updateXml(QTextTable* table) {
 int MyTableId = table->property("MyTableId").toInt();
 ...
 ...
// Get next table from XmlDoc
// Update QDomElement, setAttribute ( const QString & name, int value )
// Add data to NewXmlDoc
}

Соответветственно в updateXml нужно получить из XmlDoc сответствующий(по порядку, учитывая вложенность) QDomElement с "<table>" и добавить в него атрибут со значением MyTableId.
Ну и естественно пересобрать QDomDocument с обновленными QDomElements;

Записан
masha
Гость
« Ответ #7 : Август 04, 2009, 14:00 »

ммм, видимо я коряво вопрос задаю Смеющийся. У меня всё проще, мне не надо парсить саму таблицу, мне нужен только кусок её html-кода. А все таблицы у меня делятся на те которые мне нужно сохранить (в виде строки "<table>...</table>") и те, которые нужно проигнорировать. Всё что выше сказано было бы здорово, если бы у QTextFrame можно было бы взять html код, QTextFrame.document().toHtml() желаемого результата не даёт. Всё равно спасибо!
Записан
spectre71
Гость
« Ответ #8 : Август 04, 2009, 14:13 »

ммм, видимо я коряво вопрос задаю Смеющийся. У меня всё проще, мне не надо парсить саму таблицу, мне нужен только кусок её html-кода. А все таблицы у меня делятся на те которые мне нужно сохранить (в виде строки "<table>...</table>") и те, которые нужно проигнорировать. Всё что выше сказано было бы здорово, если бы у QTextFrame можно было бы взять html код, QTextFrame.document().toHtml() желаемого результата не даёт. Всё равно спасибо!
Всегда можно создать временный QTextDocument с неким QTextFrame и получить QTextDocument.toHtml()
А вообще опиши задачу подробнее и привиди пример, а то никто похоже так и непонял что ты хочешь добиться!
Записан
masha
Гость
« Ответ #9 : Август 04, 2009, 18:16 »

Всегда можно создать временный QTextDocument с неким QTextFrame и получить QTextDocument.toHtml()
Что-то я не нашла как это сделать. textFrame.document() - вернет весь документ, а не кусок.

А вообще опиши задачу подробнее и привиди пример, а то никто похоже так и непонял что ты хочешь добиться!

Да что-то не хотелось никого сильно нагружать Грустный

В общем: цель - создать шаблон отчета; есть генератор отчетов, на его странице (графическая сцена) я размечаю только области: область текста и область таблицы с данными из БД. Область текста здесь - это графич. элемент, в свойстве "text" которого - html код. При запуске эта сцена анализируется и составляется сначала xml-док, потом он конвертится в html-док с целью открыть его в QTextEdit (здесь уже будут таблицы из БД), заполнить шаблон базовыми данными, где можно вставить простую табличку и сохранить содержимое текстовых областей обратно в xml-отчет. Вот такая лабудень Улыбающийся
 Даже если мне удаётся сначала сохранить нужные таблички, когда они выглядели вот так:
<table cellspacing="2" border="3" align="center" >    -  без атрибута style, в отличие от БД-шных,
то при повторном запуске (после m_textEdit->setHtml(m_HtmlDocument)Подмигивающий они уже выглядят вот так:
<table border="3" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" align="center" cellspacing="2" cellpadding="0">
добавляется атрибут style, и все таблицы выглядят одинаково Грустный
Думаю, тут никакие индексы бы не помогли.


Записан
spectre71
Гость
« Ответ #10 : Август 04, 2009, 20:01 »

Всегда можно создать временный QTextDocument с неким QTextFrame и получить QTextDocument.toHtml()
Что-то я не нашла как это сделать. textFrame.document() - вернет весь документ, а не кусок.
Я имел ввиду другое - получить некоторый TextFrame и создать новый документ от этого TextFrame(если это вообще возможно). И уже у нового документа получить XML.

А вообще описывал другой вариант:
1) при добавлении(или еще когда) таблиц устанавливаем им свое property со значением
QTextTable::setProperty("MyTableId", int);
2) Закончили работу с текстом, получили XML
3) Пребираем рекурсивно фреймы документа, берем из них те которые являются таблицими, получаем у них значение нашего property.
    Пребираем рекурсивно елементы XML берем елементы "<table>" добавляем атрибут со  значением из соответствующего property.
    Поскольку вложенность таблиц в докуенте и XML совпадает, проблем с соответствием не должно быть.



 
Записан
masha
Гость
« Ответ #11 : Август 05, 2009, 10:04 »


Так я примерно так и пыталась это сделать. В общем, первый раз мне удаётся его сохранить, но какой бы атрибут в теге <table> я не написала, он (textEdit) потом его всё равно проигнарирует, Qt оставляет только border, align, cellspacing, cellpadding и style. И, соответственно, не будет уже у TextFrame никакого property(MyTableId), это ведь будет уже новый html док. --> Таблицы будут снова выглядеть одинаково. Только если вручную, например, через конткстное меню, снова устанавливать для нужных таблиц свойство MyTableId Улыбающийся.
Короче, как-нибудь некрасиво из этой ситуации выйти можно, а лучше в корне пересмотреть весь механизм Грустный . Просто так было проще всего, все стили, цвета, пробелы - всё само сохранялось, без проблем. А тут эти таблицы...
Записан
Tonal
Гость
« Ответ #12 : Август 05, 2009, 10:08 »

Может попробовать QWebView?
Он весь html + css поддерживает.
Записан
masha
Гость
« Ответ #13 : Август 05, 2009, 11:41 »

Может попробовать QWebView?
Он весь html + css поддерживает.

Мне ж его редактировать надо. QWebView - это вроде просто просмотрщик.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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