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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextDocument: границы ячеек в таблице  (Прочитано 11792 раз)
qks1
Гость
« : Март 25, 2013, 14:38 »

Доброго дня!
Есть необходимость вывести на печать отчётик с непростой таблицей... В последней строке этой таблицы должна рисоваться только часть ячеек, упрощённый пример:



В хтмл, если тупо закодить всё топором, это выглядит вот так:
Код
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'ом  Непонимающий
Записан
qks1
Гость
« Ответ #1 : Март 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);



Если же индусить а-ля вышеприведённый хтмл и задавать стиль для каждой ячейки, то вместо границ рисуется боль и пустота:
Код
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);



А мне нужно получить такую табличку, как в предыдущем посте.
Записан
carrygun
Гость
« Ответ #2 : Март 26, 2013, 06:30 »

Я с текстДокументом не работал, но еще один из наркоманских вариантов - загнать все в html и распечатать из webView  Веселый
Записан
qks1
Гость
« Ответ #3 : Март 26, 2013, 11:43 »

Я с текстДокументом не работал, но еще один из наркоманских вариантов - загнать все в html и распечатать из webView  Веселый

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

Код
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. Но вместо таблицы на всю страницу с аккуратными десятимиллиметровыми полями я получаю вот такую бяку (ссылка, ибо картинка великовата для вставки).

Причём скроллбар появляется только со второй страницы, на первой его нет. Что с этим делать? С QWebView раньше не работал, так что мог пропустить что-то совсем очевидное  Непонимающий
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Март 27, 2013, 23:34 »

папиарю свой отчетник чуток:

« Последнее редактирование: Март 27, 2013, 23:49 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Март 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");
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
qks1
Гость
« Ответ #6 : Март 28, 2013, 14:54 »

папиарю свой отчетник чуток:

Уже видели, эту тему читали (да-да, речь идёт в том числе и о торг-12)  Улыбающийся
Пока что решил всё-таки действительно отрисовывать вручную QPainter'ом... Это не так страшно, как казалось на первый взгляд, и полный контроль над результатом  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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