Russian Qt Forum

Qt => Печать => Тема начата: qks1 от Март 25, 2013, 14:38



Название: QTextDocument: границы ячеек в таблице
Отправлено: qks1 от Март 25, 2013, 14:38
Доброго дня!
Есть необходимость вывести на печать отчётик с непростой таблицей... В последней строке этой таблицы должна рисоваться только часть ячеек, упрощённый пример:

(https://lh4.googleusercontent.com/-bq_qJB-V28o/UVA1SizGqqI/AAAAAAAAAJ0/vA9nVDCNCIA/s124/qqq.JPG)

В хтмл, если тупо закодить всё топором, это выглядит вот так:
Код
HTML
<table cellspacing=0 style="border-collapse: collapse">
<tr><td style='border: 1px solid black'>1</td>
   <td style='border: 1px solid black'>2</td>
   <td style='border: 1px solid black'>3</td></tr>
<tr><td style='border: 1px solid black'>One</td>
   <td style='border: 1px solid black'>Two</td>
   <td style='border: 1px solid black'>Three</td></tr>
<tr><td style='border-width: 1 0 0; border-style: solid; border-color: black'></td>
   <td style='border-width: 1 0 0; border-style: solid; border-color: black'></td>
   <td style='border: 1px solid black'>Finish</td></tr>
</table>

То есть у двух первых ячеек в нижней строке мы рисуем только верхнюю границу, а у остальных - все (я знаю, что это мегаговнокод, оно здесь просто чтобы объяснить идею). Но кьютовский setHtml не поддерживает стили для отдельных ячеек, только для всей таблицы. Точно так же и в QTextTable можно задавать формат только для таблицы целиком, так что этот вариант тоже в пролёте. А как ещё можно нарисовать таблицу - я не знаю...
Эмм... эни саггешнс? В голову лезет только совсем наркоманский вариант вручную отрисовывать все линии QPainter'ом  ???


Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: qks1 от Март 25, 2013, 15:09
Для пущей понятности:
если задать стиль границ для всей таблицы, то границы замечательно отрисовываются:
Код
C++ (Qt)
   QString html = "<html><body>";
   html += "<table cellspacing=0 cellpadding = 2 style='border-width: 1px; border-style: solid; border-color: #000000'>";
   html += "<tr>";
   html += "<td>1</td>";
   html += "<td>2</td>";
   html += "<td>3</td>";
   html += "</tr>";
   html += "<tr>";
   html += "<td>One</td>";
   html += "<td>Two</td>";
   html += "<td>Three</td>";
   html += "</tr>";
   html += "<tr>";
   html += "<td></td>";
   html += "<td></td>";
   html += "<td>Finish</td>";
   html += "</tr>";
   html += "</table></body></html>";
 
   page->setHtml(html);

(https://lh5.googleusercontent.com/-rGzWKbKaXvg/UVA9kb6iucI/AAAAAAAAAKY/jkBFuONh8jQ/s126/qq1.JPG)

Если же индусить а-ля вышеприведённый хтмл и задавать стиль для каждой ячейки, то вместо границ рисуется боль и пустота:
Код
C++ (Qt)
   QString html = "<html><body>";
   html += "<table cellspacing=0 cellpadding=2'>";
   html += "<tr>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>1</td>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>2</td>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>3</td>";
   html += "</tr>";
   html += "<tr>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>One</td>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>Two</td>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>Three</td>";
   html += "</tr>";
   html += "<tr>";
   html += "<td style='border-style: none;'></td>";
   html += "<td style='border-style: none;'></td>";
   html += "<td style='border-width: 1px; border-style: solid; border-color: #000000'>Finish</td>";
   html += "</tr>";
   html += "</table></body></html>";
 
   page->setHtml(html);

(https://lh6.googleusercontent.com/-FbbL9OoC0Sg/UVA9kVggsTI/AAAAAAAAAKc/2eI0N75UIs8/s125/qq2.JPG)

А мне нужно получить такую табличку, как в предыдущем посте.


Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: carrygun от Март 26, 2013, 06:30
Я с текстДокументом не работал, но еще один из наркоманских вариантов - загнать все в html и распечатать из webView  :D


Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: qks1 от Март 26, 2013, 11:43
Я с текстДокументом не работал, но еще один из наркоманских вариантов - загнать все в html и распечатать из webView  :D

А ведь это мысля! Табличка рисуется гораздо проще и аккуратнее, спасибо за совет!
Но вот с печатью пока беда. Накодил что-то такое:

Код
C++ (Qt)
void MainWindow::preview(){
   QPrinter printer;
   printer.setPageSize(QPrinter::A4);
   printer.setOrientation(QPrinter::Portrait);
   printer.setPageMargins(10,10,10,10,QPrinter::Millimeter);
 
   QPrintPreviewDialog print_preview(&printer, this);
   print_preview.setWindowState(Qt::WindowMaximized);
   connect(&print_preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paint_pages(QPrinter*)));
   print_preview.exec();
}
 
void MainWindow::paint_pages(QPrinter *printer){
   QList<QWebView*> pages;
   QWebView *current = 0;
   QPainter painter(printer);
   int i = 0;
   while(i <= 100){
       current = new QWebView();
       pages << current;
       i = populate_web(current, printer, i);
   }
   int pc = pages.count();
   for(i = 0; i < pc; i++){
       if(i != 0) printer->newPage();
       pages.at(i)->render(&painter);
   }
   for(i = 0; i < pc; i++)
       delete pages.at(i);
}
 
 
int MainWindow::populate_web(QWebView *pg, QPrinter *printer, int n){
   QString html = "<html><body>";
   html += "<table cellspacing=0 border = 1 style='border-collapse: collapse'>";
   int page_height = printer->paperRect(QPrinter::Point).height();
   for(++n; n <= 100; n++){
       html += QString("<tr><td width=200>%1</td><td width=200>%2</td><td width=300>%3</td></tr>").arg(n).arg(n*n).arg(n*n*n);
       QString html2 = html + "</table></body></html>";
       pg->setHtml(html2);
       int content_height = pg->page()->mainFrame()->contentsSize().height();
       if(content_height + 20 > page_height)
           break;
   }
   html += "</table></body></html>";
 
   pg->setHtml(html);
   return n;
}
 

То есть я хочу вывести таблицу из ста строк, разбив её на две (или сколько потребуется) страницы. В функции populate_web есть цикл, который добавляет строку к таблице и заодно отслеживает приближение конца страницы, сравнивая content_height и page_height. Но вместо таблицы на всю страницу с аккуратными десятимиллиметровыми полями я получаю вот такую бяку (ссылка (https://lh4.googleusercontent.com/-JVkbhfw8KEg/UVFeu86znAI/AAAAAAAAAK8/QnvTwyhtX-g/s901/%D0%91%D0%B5%D0%B7+%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8.png), ибо картинка великовата для вставки).

Причём скроллбар появляется только со второй страницы, на первой его нет. Что с этим делать? С QWebView раньше не работал, так что мог пропустить что-то совсем очевидное  ???


Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: panAlexey от Март 27, 2013, 23:34
папиарю свой отчетник (http://code.google.com/p/unnstudioreport/) чуток:



Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: panAlexey от Март 27, 2013, 23:54
Упс, ошибочка вышла.
надо не:
Код:
doc->setCellText(1,3,"3");	doc->setCellText(2,3,"Three");doc->setCellText(2,3,"Finish");
а так:
Код:
doc->setCellText(1,3,"3");	doc->setCellText(2,3,"Three");doc->setCellText(3,3,"Finish");


Название: Re: QTextDocument: границы ячеек в таблице
Отправлено: qks1 от Март 28, 2013, 14:54
папиарю свой отчетник (http://code.google.com/p/unnstudioreport/) чуток:

Уже видели, эту тему (http://www.prog.org.ru/topic_19872_0.html) читали (да-да, речь идёт в том числе и о торг-12)  :)
Пока что решил всё-таки действительно отрисовывать вручную QPainter'ом... Это не так страшно, как казалось на первый взгляд, и полный контроль над результатом  :)