void KDReports::AbstractTableElement::fillTableFormat( QTextTableFormat& tableFormat, QTextCursor& textDocCursor ) const { if ( d->m_width ) { if ( d->m_unit == Millimeters ) { tableFormat.setWidth( QTextLength( QTextLength::FixedLength, mmToPixels( d->m_width ) ) ); } else { tableFormat.setWidth( QTextLength( QTextLength::PercentageLength, d->m_width ) ); } } tableFormat.setBorder( border() ); #if QT_VERSION >= 0x040300 tableFormat.setBorderBrush( borderBrush() ); tableFormat.setBorderStyle( QTextFrameFormat::BorderStyle_Solid ); #endif tableFormat.setCellPadding( mmToPixels( padding() ) ); tableFormat.setCellSpacing( -1 ); // HTML-like table borders look so old century if ( d->m_fontSpecified ) { QTextCharFormat charFormat = textDocCursor.charFormat(); charFormat.setFont( d->m_defaultFont ); textDocCursor.setCharFormat( charFormat ); } }
void KWQTableView::createPages(QPrinter *printer, QTextDocument *textDoc, bool sendToPrinter) { printer->setFullPage(true); int myDpi = printer->logicalDpiY(); if (Prefs::printStyle() == Prefs::EnumPrintStyle::Flashcard) { printer->setOrientation(QPrinter::Landscape); int cardWidth = qRound(5 * qreal(myDpi)); int cardHeight = qRound(3 * qreal(myDpi)); QTextTable *table = textDoc->rootFrame()->lastCursorPosition().insertTable(model()->rowCount(), 2); QTextTableFormat tableFormat = table->format(); tableFormat.setHeaderRowCount(0); tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_None); tableFormat.setCellSpacing(0); tableFormat.setCellPadding(0); QVector<QTextLength> constraints; constraints.append(QTextLength(QTextLength::FixedLength, cardWidth)); constraints.append(QTextLength(QTextLength::FixedLength, cardWidth)); tableFormat.setColumnWidthConstraints(constraints); table->setFormat(tableFormat); QTextBlockFormat headerFormat; headerFormat.setAlignment(Qt::AlignLeft); QTextCharFormat headerCharFormat; headerCharFormat.setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont)); QTextBlockFormat cellFormat; cellFormat.setAlignment(Qt::AlignCenter); QTextCharFormat cellCharFormat; cellCharFormat.setFont(Prefs::editorFont()); QTextFrameFormat cardFormat; cardFormat.setBorder(1); cardFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid); cardFormat.setBorderBrush(QBrush(Qt::black)); cardFormat.setWidth(QTextLength(QTextLength::FixedLength, cardWidth)); cardFormat.setHeight(QTextLength(QTextLength::FixedLength, cardHeight)); cardFormat.setPadding(qRound(0.25 * myDpi)); QTextFrameFormat lineFormat; lineFormat.setBorder(1); lineFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid); lineFormat.setBorderBrush(QBrush(Qt::black)); lineFormat.setWidth(QTextLength(QTextLength::FixedLength, qRound(4.5 * myDpi))); lineFormat.setHeight(1.1); //1 is drawn as a box whereas this is drawn as a line. Strange... lineFormat.setPadding(0); QTextFrame *card; for (int i = 0; i < model()->rowCount(); i++) { for (int j = 0; j < model()->columnCount(); j++) { cardFormat.setPosition(QTextFrameFormat::FloatLeft); card = table->cellAt(i, j).firstCursorPosition().insertFrame(cardFormat); card->lastCursorPosition().insertText(model()->headerData(j, Qt::Horizontal, Qt::DisplayRole).toString(), headerCharFormat); card->lastCursorPosition().insertFrame(lineFormat); card->lastCursorPosition().insertBlock(); card->lastCursorPosition().insertBlock(); card->lastCursorPosition().insertBlock(cellFormat, cellCharFormat); card->lastCursorPosition().insertText(model()->data(model()->index(i, j)).toString(), cellCharFormat); } } } else { textDoc->rootFrame()->lastCursorPosition().insertText(QStringLiteral("kwordquiz %1").arg(KWQ_VERSION)); if (Prefs::printStyle() == Prefs::EnumPrintStyle::Exam) textDoc->rootFrame()->lastCursorPosition().insertText(' ' + i18n("Name:_____________________________ Date:__________")); QTextTable* table; if (Prefs::printStyle() == Prefs::EnumPrintStyle::Exam) table = textDoc->rootFrame()->lastCursorPosition().insertTable(model()->rowCount() + 1, model()->columnCount() + 2); else table = textDoc->rootFrame()->lastCursorPosition().insertTable(model()->rowCount() + 1, model()->columnCount() + 1); QTextTableFormat tableFormat = table->format(); tableFormat.setHeaderRowCount(1); tableFormat.setBorder(1); tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid); tableFormat.setCellSpacing(0); tableFormat.setBorderBrush(QBrush(Qt::black)); tableFormat.setCellPadding(2); QVector<QTextLength> constraints; constraints.append(QTextLength(QTextLength::FixedLength, verticalHeader()->width())); constraints.append(QTextLength(QTextLength::FixedLength, columnWidth(0))); constraints.append(QTextLength(QTextLength::FixedLength, columnWidth(1))); if (Prefs::printStyle() == Prefs::EnumPrintStyle::Exam) constraints.append(QTextLength(QTextLength::FixedLength, 50)); tableFormat.setColumnWidthConstraints(constraints); table->setFormat(tableFormat); QTextBlockFormat headerFormat; headerFormat.setAlignment(Qt::AlignHCenter); QTextCharFormat headerCharFormat; headerCharFormat.setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont)); QTextCursor cellCursor; cellCursor = table->cellAt(0, 1).firstCursorPosition(); cellCursor.mergeBlockFormat(headerFormat); cellCursor.mergeCharFormat(headerCharFormat); cellCursor.insertText(model()->headerData(0, Qt::Horizontal, Qt::DisplayRole).toString()); cellCursor = table->cellAt(0, 2).firstCursorPosition(); cellCursor.mergeBlockFormat(headerFormat); cellCursor.mergeCharFormat(headerCharFormat); cellCursor.insertText(model()->headerData(1, Qt::Horizontal, Qt::DisplayRole).toString()); if (Prefs::printStyle() == Prefs::EnumPrintStyle::Exam) { cellCursor = table->cellAt(0, 3).firstCursorPosition(); cellCursor.mergeBlockFormat(headerFormat); cellCursor.mergeCharFormat(headerCharFormat); cellCursor.insertText(i18n("Score")); } headerCharFormat = cellCursor.charFormat(); QTextCharFormat cellCharFormat = cellCursor.charFormat(); cellCharFormat.setFont(Prefs::editorFont()); for (int i = 0; i < model()->rowCount(); i++) { table->cellAt(i + 1, 0).firstCursorPosition().insertText(model()->headerData(i, Qt::Vertical, Qt::DisplayRole).toString(), headerCharFormat); table->cellAt(i + 1, 1).firstCursorPosition().insertText(model()->data(model()->index(i, 0)).toString(), cellCharFormat); if (Prefs::printStyle() == Prefs::EnumPrintStyle::List) table->cellAt(i + 1, 2).firstCursorPosition().insertText(model()->data(model()->index(i, 1)).toString(), cellCharFormat); } } if (sendToPrinter) textDoc->print(printer); }
void CDiaryEdit::draw(QTextDocument& doc) { CDiaryEditLock lock(this); QFontMetrics fm(QFont(font().family(),10)); bool hasGeoCaches = false; int cnt; int w = doc.textWidth(); int pointSize = ((10 * (w - 2 * ROOT_FRAME_MARGIN)) / (CHAR_PER_LINE * fm.width("X"))); if(pointSize == 0) return; doc.setUndoRedoEnabled(false); QFont f = textEdit->font(); f.setPointSize(pointSize); textEdit->setFont(f); QTextCharFormat fmtCharHeading1; fmtCharHeading1.setFont(f); fmtCharHeading1.setFontWeight(QFont::Black); fmtCharHeading1.setFontPointSize(f.pointSize() + 8); QTextCharFormat fmtCharHeading2; fmtCharHeading2.setFont(f); fmtCharHeading2.setFontWeight(QFont::Black); fmtCharHeading2.setFontPointSize(f.pointSize() + 4); QTextCharFormat fmtCharStandard; fmtCharStandard.setFont(f); QTextCharFormat fmtCharHeader; fmtCharHeader.setFont(f); fmtCharHeader.setBackground(Qt::darkBlue); fmtCharHeader.setFontWeight(QFont::Bold); fmtCharHeader.setForeground(Qt::white); QTextBlockFormat fmtBlockStandard; fmtBlockStandard.setTopMargin(10); fmtBlockStandard.setBottomMargin(10); fmtBlockStandard.setAlignment(Qt::AlignJustify); QTextFrameFormat fmtFrameStandard; fmtFrameStandard.setTopMargin(5); fmtFrameStandard.setBottomMargin(5); fmtFrameStandard.setWidth(w - 2 * ROOT_FRAME_MARGIN); QTextFrameFormat fmtFrameRoot; fmtFrameRoot.setTopMargin(ROOT_FRAME_MARGIN); fmtFrameRoot.setBottomMargin(ROOT_FRAME_MARGIN); fmtFrameRoot.setLeftMargin(ROOT_FRAME_MARGIN); fmtFrameRoot.setRightMargin(ROOT_FRAME_MARGIN); QTextTableFormat fmtTableStandard; fmtTableStandard.setBorder(1); fmtTableStandard.setBorderBrush(Qt::black); fmtTableStandard.setCellPadding(4); fmtTableStandard.setCellSpacing(0); fmtTableStandard.setHeaderRowCount(1); fmtTableStandard.setTopMargin(10); fmtTableStandard.setBottomMargin(20); fmtTableStandard.setWidth(w - 2 * ROOT_FRAME_MARGIN); QVector<QTextLength> constraints; constraints << QTextLength(QTextLength::FixedLength, 32); constraints << QTextLength(QTextLength::VariableLength, 50); constraints << QTextLength(QTextLength::VariableLength, 100); fmtTableStandard.setColumnWidthConstraints(constraints); doc.rootFrame()->setFrameFormat(fmtFrameRoot); QTextCursor cursor = doc.rootFrame()->firstCursorPosition(); cursor.insertText(diary.getName(), fmtCharHeading1); cursor.setCharFormat(fmtCharStandard); cursor.setBlockFormat(fmtBlockStandard); diary.diaryFrame = cursor.insertFrame(fmtFrameStandard); { QTextCursor cursor1(diary.diaryFrame); cursor1.setCharFormat(fmtCharStandard); cursor1.setBlockFormat(fmtBlockStandard); if(diary.getComment().isEmpty()) { cursor1.insertText(tr("Add your own text here...")); } else { cursor1.insertHtml(diary.getComment()); } cursor.setPosition(cursor1.position()+1); } if(!diary.getWpts().isEmpty()) { QList<CWpt*>& wpts = diary.getWpts(); cursor.insertText(tr("Waypoints"),fmtCharHeading2); QTextTable * table = cursor.insertTable(wpts.count()+1, eMax, fmtTableStandard); diary.tblWpt = table; table->cellAt(0,eSym).setFormat(fmtCharHeader); table->cellAt(0,eInfo).setFormat(fmtCharHeader); table->cellAt(0,eComment).setFormat(fmtCharHeader); table->cellAt(0,eInfo).firstCursorPosition().insertText(tr("Info")); table->cellAt(0,eComment).firstCursorPosition().insertText(tr("Comment")); cnt = 1; qSort(wpts.begin(), wpts.end(), qSortWptLessTime); foreach(CWpt * wpt, wpts) { table->cellAt(cnt,eSym).firstCursorPosition().insertImage(wpt->getIcon().toImage().scaledToWidth(16, Qt::SmoothTransformation)); table->cellAt(cnt,eInfo).firstCursorPosition().insertText(wpt->getName() + "\n" + wpt->getInfo(), fmtCharStandard); QTextCursor c = table->cellAt(cnt,eComment).firstCursorPosition(); c.setCharFormat(fmtCharStandard); c.setBlockFormat(fmtBlockStandard); c.insertHtml(wpt->getComment()); if(wpt->isGeoCache()) { hasGeoCaches = true; } cnt++; }
void CalcFrame::printCalc() { const auto milkReception = m_mainWindow->database()->milkReception(); if (!milkReception) { Utils::Main::showMsgIfDbNotChoosed(this); return; } DataWorker dw(m_mainWindow->database()); try { dw.loadMilkReceptions(getWhereQuery()); } catch (const QString &err) { QMessageBox::critical(this, tr("Расчеты"), tr("Произошла ошибка во время подгрузки данных: ") + err); } const auto deliverers = dw.getDeliverers().values(); if (deliverers.isEmpty()) { QMessageBox::information(this, tr("Печать"), tr("Отсутствуют данные для печати")); return; } const char f = 'f'; int row = 0; const auto settings = m_mainWindow->getSettings(); const auto printColumns = m_mainWindow->getSettings()->getPrint().columns; QStringList columns; for (int i = 0; i < printColumns.size(); ++i) { const auto &col = printColumns[i]; if (col.isShow) columns.append(printColumns[i].display); } const int columnsCount = columns.size(); if (columnsCount <= 0) { QMessageBox::information(this, tr("Печать сдачи молока"), tr("Не выбрана ни одна колонка для печати")); return; } const Settings::Column snCol = printColumns[Constants::PrintColumns::SerialNumber], delivNameCol = printColumns[Constants::PrintColumns::DeliverersName], litersCol = printColumns[Constants::PrintColumns::Liters], fatCol = printColumns[Constants::PrintColumns::Fat], proteinCol = printColumns[Constants::PrintColumns::Protein], fatUnitsCol = printColumns[Constants::PrintColumns::FatUnits], rankWeightCol = printColumns[Constants::PrintColumns::RankWeight], payCol = printColumns[Constants::PrintColumns::PayWithOutPrem], permiumCol = printColumns[Constants::PrintColumns::Premium], sumCol = printColumns[Constants::PrintColumns::Sum], signCol = printColumns[Constants::PrintColumns::Sign]; auto itemToPrintRow = [&](const QString &delivName, const CalculatedItem::Data &item, const int rowPos = -1) -> QStringList { QStringList row; if (snCol.isShow) row.append(rowPos >= 0 ? QString::number(rowPos) : QString()); if (delivNameCol.isShow) row.append(delivName); if (litersCol.isShow) row.append(QString::number(item.liters, f, litersCol.prec)); if (fatCol.isShow) row.append(QString::number(item.fat, f, fatCol.prec)); if (proteinCol.isShow) row.append(QString::number(item.protein, f, proteinCol.prec)); if (fatUnitsCol.isShow) row.append(QString::number(item.fatUnits, f, fatCol.prec)); if (rankWeightCol.isShow) row.append(QString::number(item.rankWeight, f, rankWeightCol.prec)); if (payCol.isShow) row.append(QString::number(item.paymentWithOutPremium, f, payCol.prec)); if (permiumCol.isShow) row.append(QString::number(item.premiumForFat, f, permiumCol.prec)); if (sumCol.isShow) row.append(QString::number(floor(item.sum), f, sumCol.prec)); if (signCol.isShow) row.append(QString()); return row; }; const auto &printSettings = settings->getPrint(); QTextTableFormat tableFormat; tableFormat.setBorder(printSettings.tableBorderWidth); tableFormat.setBorderStyle(static_cast<QTextFrameFormat::BorderStyle>(printSettings.tableBorderStyle)); tableFormat.setColumns(columnsCount); tableFormat.setAlignment(Qt::AlignHCenter); tableFormat.setWidth(QTextLength(QTextLength::VariableLength, 100)); tableFormat.setBorderBrush(QBrush(printSettings.tableBorderColor)); tableFormat.setCellSpacing(printSettings.cellSpacing); tableFormat.setCellPadding(printSettings.cellPadding); PrintTable print(columnsCount, tableFormat); { auto &textFormat = print.getTableBodyTextFormat(); textFormat.setFont(printSettings.tableTextFont); textFormat.setForeground(QBrush(printSettings.tableTextColor)); } { auto &textFormat = print.getTableHeadersFormat(); textFormat.setFont(printSettings.tableHeaderFont); textFormat.setForeground(QBrush(printSettings.tableHeaderColor)); } print.setHeaders(columns); CalculatedItem::Data allResult; for (const auto &deliverer: deliverers) { row++; const CalculatedItem::Data calcItem = deliverer->getCalculations(); print.addRow(itemToPrintRow(deliverer->name(), calcItem, row)); allResult += calcItem; } int mergeCount = 0; auto itemRow = itemToPrintRow("Итого", allResult, row); for (int i = 0; i < Constants::PrintColumns::Liters; i++) { const auto &col = printColumns[i]; if (col.isShow) mergeCount++; } QTextCharFormat resultFormat; resultFormat.setFont(printSettings.tableResultFont); resultFormat.setForeground(QBrush(printSettings.tableResultColor)); print.addRow(itemRow, resultFormat, mergeCount); auto &cursor = print.cursor(); cursor.setPosition(0); QTextFrameFormat topFrameFormat; topFrameFormat.setPadding(4); cursor.insertFrame(topFrameFormat); QTextBlockFormat textBlockFormat; textBlockFormat.setBottomMargin(4); textBlockFormat.setAlignment(Qt::AlignLeft); QTextBlockFormat captionBlockFormat; captionBlockFormat.setAlignment(Qt::AlignCenter); cursor.setBlockFormat(textBlockFormat); QTextCharFormat textCharFormat; textCharFormat.setFont(printSettings.textFont); QTextCharFormat captionCharFormat; captionCharFormat.setFont(printSettings.captionTextFont); captionCharFormat.setForeground(QBrush(printSettings.captionColor)); cursor.insertText(settings->getFirmName(), textCharFormat); cursor.insertBlock(); cursor.setBlockFormat(captionBlockFormat); auto dateMin = QDate(), dateMax = QDate(); if (isCalcByDate()) { dateMin = ui->dateEditFilterStart->date(); dateMax = ui->dateEditFilterEnd->date(); } else { dateMin = milkReception->getMinDeliveryDate(); dateMax = milkReception->getMaxDeliveryDate(); } const auto s = dateMax == dateMin ? tr("%1 число").arg(dateMin.toString(Constants::defaultDateFormat())) : tr("период с %1 по %2") .arg(dateMin.toString(Constants::defaultDateFormat())) .arg(dateMax.toString(Constants::defaultDateFormat())); cursor.insertText(QString(tr("Платежная ведомость №\n" "за сданное молоко\n" "за ") + s), captionCharFormat); cursor.insertBlock(); cursor.setBlockFormat(textBlockFormat); cursor.insertText(tr("Населенный пункт: ") + m_mainWindow->getCurrentLocalityName(), textCharFormat); cursor.insertBlock(); cursor.insertText(tr("Приемщик молока: ") + settings->getMilkInspector(), textCharFormat); cursor.insertBlock(); cursor.movePosition(QTextCursor::End); QTextFrameFormat bottomFrameFormat; bottomFrameFormat.setPadding(4); cursor.insertFrame(bottomFrameFormat); cursor.setBlockFormat(textBlockFormat); const auto minMaxPrice = milkReception->getMinMaxPriceLiter(dateMin, dateMax); if (minMaxPrice.first > .0 && minMaxPrice.second > .0) { const QString minPrice = QString::number(minMaxPrice.first, f, 2), maxPrice = QString::number(minMaxPrice.second, f, 2); cursor.insertText(tr("Цена: %1").arg(minPrice == maxPrice ? minPrice : QString("%1 - %2") .arg(minPrice).arg(maxPrice))); cursor.insertBlock(); } cursor.insertText(tr("Деньги в сумме: "), textCharFormat); cursor.insertBlock(); cursor.insertText(tr("Получил и выдал согласно ведомости приемщик молока______") + settings->getMilkInspector_2(), textCharFormat); cursor.insertBlock(); cursor.insertText(tr("Директор ") + settings->getFirmName(), textCharFormat); print.showDialog(); }