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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: HTML шаблоны и печать  (Прочитано 9921 раз)
skydion
Гость
« : Март 17, 2010, 12:19 »

Привет всем!

1. Есть ли какая-то самая простая и небольшая библиотека для создания шаблонов страниц и последующего их заполнения? Ну типа создаем шаблон html-страницы и дальше его заполняем для печати. Или есть какие-то идеи как это сделать в Qt?

2. Я так понял, и увидел здесь на формуе что QPrintPreviewWidget должен отображать еще панель управления предпросмотром, или я ошибаюсь? А то у меня пустой виджет без панели и страница предпросмотра...
Записан
villager
Гость
« Ответ #1 : Март 18, 2010, 23:11 »

как угодно создавай html (шаблон с метками, при формировании метки меняй на данные - простая обработка текста)
скармливай QWebView (используй QWebView.setHtml() )
примеров для с предварительным просмотром на форуме много
рабочий пример на с++ дать не могу Грустный - пишу на питоне
Записан
voronElf
Гость
« Ответ #2 : Март 19, 2010, 07:39 »

подождал, про библиотеки шаблонов никто не написал, жаль, я пользуюсь подходом как и у villager
в файл ресурсов кладу шаблон с метками, при запросе нужного дока - заполняю.

Живой пример (выдернул из проги):
Шаблон:
Код:
<html><body>
<div align=center><table><tr><td>
<p align=right><small>
Приложение №1<br />
к Правилам ведения журнало учета полученных и выставленных счетов-фактур,<br />
книг покупок и книг продаж при расчетах по налогу на добавленную стоимость,<br />
утвержденным постановлением Правительства Российской Федерации от 2 декабря 2000г. №914<br />
(в реакции постановлений Правительства Российской Федерации от 15 марта 2001г. №189<br />
от 27 июля 200г. №575, от 16 февраля 2004г. №84, от 11 мая 2005г. №283)
</small></p>
<h2>Счет-фактура № [NUMB] от [DATE] г.</h2>
Продавец: [VEND_FULL_INFO]<br />
Грузоотправитель и его адрес: ----<br />
Грузополучатель и его адрес: ----<br />
К платежно-расчетному документу № __________ от ______________<br />
Покупатель: [USER_FULL_INFO]<br />
<table align=center valign=middle cellpadding=3 border=1 cellspacing=-1 style="border-color: #000000;">
<tr>
<th>Наименование товара(описание выполненных работ, оказанных услуг), имущественного права</th><th>Единица изме-<br />рения</th>
<th>Коли-<br />чество</th><th>Цена(тариф) за единицу измерения</th><th>Стоимость товаров(работ, услуг), имуществен-<br />ных прав, всего без налога</th>
<th>В том числе акциз</th><th>Налоговая ставка</th><th>Сумма налога</th>
<th>Стоимость товаров(работ, услуг), имуществен-<br />ных прав, всего с учетом налога</th><th>Страна происхождения</th>
<th>Номер в таможенной декларации</th>
</tr><tr>
<th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>10</th><th>11</th>
</tr>
[ROWS_MAIN_TABLE_11]
<tr><td colspan=7><b>Всего к оплате:</b></td><td>[SUM_TAX]</td><td>[SUM_FULL]</td></tr>
</table>
<br />
<img src="[IMG_SIGN]" />
</td></tr></table></div>
</body></html>

Код обработчиков:
Код:
//---------- счет-фактуры -------------
void CModDocs::showNVoice(int id) {
    QString txt;
    QString title = textNVoice(txt, id, false);
    if(!title.isEmpty()) {
        CShowDoc *p = new CShowDoc(txt, m_printer, title);
        p->setDocIdDate(id, QDate());
        connect(p, SIGNAL(actDocExcel(int,bool)), this, SLOT(onNVoice(int,bool)) );
        m_carcas->addSubWindow(p)->show();
    }//if
}

void CModDocs::xlsNVoice(int id) {
    QString txt;
    QString title = textNVoice(txt, id, true);
    if(!title.isEmpty()) {
        QString fileName = QFileDialog::getSaveFileName(m_carcas->mainWg(), tr("Сохранение файла"), "c:/" + title + ".xls", "*.xls");
        if( fileName.isEmpty() ) return;
        QFile file(fileName);
        if(file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
            file.write( txt.toUtf8() );
            file.close();
        }else QMessageBox::critical(m_carcas->mainWg(), tr("Сохранение файла"), tr("Ошибка при сохранении. Не удалось получить доступ к файлу. Возможно файл занят другим приложением.") );
    }//if
}

QString CModDocs::textNVoice(QString & s, int id, bool inExcel) {
    if(inExcel) s = ":/templates/nvoiceXls.tpl"; else s = ":/templates/nvoice.tpl";
    QFile file(s);
    file.open(QFile::ReadOnly);
    s = tr(file.readAll());
    file.close();
    QString sql;
    //продавец
    sql = QString("SELECT name, inn, kpp, country, state, zip, addr  FROM jos_vm_vendor_info WHERE vendor_id=%1")
            .arg(m_vendorId);
    if( !(m_pDb->exec(sql) && m_pDb->next()) ) return "";
    s.replace(QString("[VEND_FULL_INFO]"), m_pDb->valStr(0)
        +tr("<br />Адрес: ")+m_pDb->valStr(3)+", "+m_pDb->valStr(4)+", "+m_pDb->valStr(5)+", "+m_pDb->valStr(6)
        +tr("<br />ИНН/КПП продавца: ")+m_pDb->valStr(1)+"/"+m_pDb->valStr(2) );

    //счет-фактура
    sql = QString("SELECT nv_numb, nv_date, company, inn, vm_userkpp, country, state, zip, address_1 FROM jos_vm_2t_waybills WHERE waybill_id=%1")
            .arg(id);
    if( !(m_pDb->exec(sql) && m_pDb->next()) ) return "";
    s.replace(QString("[USER_FULL_INFO]"), m_pDb->valStr(2)
        +tr("<br />Адрес: ")+m_pDb->valStr(5)+", "+m_pDb->valStr(6)+", "+m_pDb->valStr(7)+", "+m_pDb->valStr(8)
        +tr("<br />ИНН/КПП покупателя: ")+m_pDb->valStr(3)+"/"+m_pDb->valStr(4) );
    QString sNumb = m_pDb->valStr(0);
    s.replace(QString("[NUMB]"), sNumb );
    QDate date = m_pDb->value(1).toDate();
    s.replace(QString("[DATE]"), date.toString("dd.MM.yyyy") );

    //товары
    sql = QString("SELECT name, product_sku, unit, quantity, price, tax FROM jos_vm_2t_waybill_items WHERE waybill_id=%1")
            .arg(id);
    if( !(m_pDb->exec(sql)) ) return "";
    QString sbuf("");
    int i=0, quan, summ_quan=0;
    double fPrice, fTax, fItemPrice, fItemTax, fSummPrice=0, fSummTax=0;
    while( m_pDb->next()){
        i++;
        fPrice = m_pDb->value(4).toDouble();
        fTax = m_pDb->value(5).toDouble();
        quan = m_pDb->valInt(3);
        fItemPrice = fPrice * quan;
        fItemTax = fPrice * fTax * quan;
        fSummPrice += fItemPrice;
        fSummTax += fItemTax;
        summ_quan += quan;
        sbuf += QString("<tr><td>%1</td><td>%2</td><td>%L3</td><td>%L4</td><td>%L5</td><td>&nbsp;</td><td>%L6</td><td>%L7</td><td>%L8</td><td>&nbsp;</td><td>&nbsp;</td></tr>")
            .arg( m_pDb->valStr(0) ).arg( m_pDb->valStr(2) ).arg(quan).arg(fPrice, 0, 'f', 2)
            .arg(fItemPrice, 0, 'f', 2).arg(fTax*100, 0, 'f', 2).arg(fItemTax, 0, 'f', 2).arg( fItemPrice + fItemTax, 0, 'f', 2 );
    }
    fPrice = fSummPrice + fSummTax;
    s.replace(QString("[ROWS_MAIN_TABLE_11]"), sbuf );
    s.replace(QString("[SUM_TAX]"), tr("%L1").arg(fSummTax, 0, 'f', 2) );
    s.replace(QString("[SUM_FULL]"), tr("%L1").arg(fPrice, 0, 'f', 2) );
    s.replace(QString("[IMG_SIGN]"), ":/templates/podpis.gif");

    return tr("Счет-фактура № %1 от %2").arg(sNumb).arg(date.toString("dd.MM.yyyy"));
}// end showNVoice

объект класса CShowDoc - отображальщик, м.б. просто QTextBrowser, но у меня там кой чего еще добавлено (печать, выгрузка в excel).
Записан
skydion
Гость
« Ответ #3 : Март 19, 2010, 13:16 »

Спасибо, о простой замене тегов в строке как-то не подумал  Шокированный все простое очевидно  Подмигивающий
Сейчас, попробую что-то придумать... если что не так опять попрошу помощи.

Тут по ходу сразу вопрос возник, у меня будут картинки... сейчас их размещаю в QImage
как их вставлять в шаблон? можно как-то сразу картинку в бинарном формате вставить
в html? или нужно будеть со ссылками извращаться и сохранением картинок на диске?

отвечу сам на свой вопрос )))
есть така фича... http://webo.in/articles/habrahabr/29-all-about-data-url-images/
теперь пойду курить доки по QtWebKit на счет поддержки этого...
« Последнее редактирование: Март 19, 2010, 13:46 от skydion » Записан
skydion
Гость
« Ответ #4 : Март 19, 2010, 13:17 »

как угодно создавай html (шаблон с метками, при формировании метки меняй на данные - простая обработка текста)
скармливай QWebView (используй QWebView.setHtml() )
примеров для с предварительным просмотром на форуме много
рабочий пример на с++ дать не могу Грустный - пишу на питоне

Спасибо, подтолкнули на мысль о предварительном просмотре и QWebView... обдумаю.
Записан
villager
Гость
« Ответ #5 : Март 25, 2010, 11:35 »

совсем забыл... у меня есть корявенький примерчик на python , который генерит странички
вот из него "главный" кусок
Код:
def mkHtml(template,body,header):
txt=template.replace("""#head_pholder#""",u"%s" % header)
txt=txt.replace("""#text_pholder#""",u"%s" % body)
return txt
« Последнее редактирование: Март 25, 2010, 16:36 от villager » Записан
Marat(Qt)
Гость
« Ответ #6 : Апрель 12, 2010, 19:13 »

Спасибо, о простой замене тегов в строке как-то не подумал  Шокированный все простое очевидно  Подмигивающий
Сейчас, попробую что-то придумать... если что не так опять попрошу помощи.

Тут по ходу сразу вопрос возник, у меня будут картинки... сейчас их размещаю в QImage
как их вставлять в шаблон? можно как-то сразу картинку в бинарном формате вставить
в html? или нужно будеть со ссылками извращаться и сохранением картинок на диске?

отвечу сам на свой вопрос )))
есть така фича... http://webo.in/articles/habrahabr/29-all-about-data-url-images/
теперь пойду курить доки по QtWebKit на счет поддержки этого...


WebKit совсем не обязателен. В QTextDocument есть такая штука:
Код:
document->addResource(QTextDocument::ImageResource,
         QUrl("mydata://image.png"), QVariant(image));
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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