Qtでテキストボックスの内容(QTextDocument)をキャンバスに描画するには?

以下のコードはQTextEditをそのまま自身のキャンバスに描画するクラスの一例です。 自由に切り貼りして、自分にあった形に直してください。 class TextCanvas : public QWidget { Q_OBJECT public: explicit TextCanvas(QWidget *parent = nullptr) : QWidget(parent) {} void setTextEdit(QTextEdit *edit) { textEdit = edit; update(); } void setDrawRect(const QRectF &rect) { drawRect = rect; update(); } protected: void paintEvent(QPaintEvent *) override { if (!textEdit) return; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QTextDocument *doc = textEdit->document(); // 横幅を指定 doc->setTextWidth(drawRect.width()); painter.save(); // ① 描画開始位置 painter.translate(drawRect.topLeft()); // ② 縦横制限 painter.setClipRect(QRectF(0, 0, drawRect.width(), drawRect.height())); // ③ 描画 doc->drawContents(&painter); painter.restore(); } private: QTextEdit *textEdit = nullptr; QRectF drawRect = QRectF(0, 0, 300, 200); // デフォルト };

2026年1月29日

QtでQTextDocumentを印刷するには?

A. QTextDocument + QPrinter QPlainTextEdit は内部で QTextDocument を使っているため、 その document をそのまま印刷できます。 基本コード(印刷ダイアログ付き) #include <QPrinter> #include <QPrintDialog> #include <QTextDocument> void MainWindow::printPlainTextEdit() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, this); dialog.setWindowTitle("印刷"); if (dialog.exec() != QDialog::Accepted) return; ui->plainTextEdit->document()->print(&printer); } 余白等を調整する QPrinter printer(QPrinter::HighResolution); printer.setPageSize(QPageSize(QPageSize::A4)); printer.setPageMargins(QMarginsF(15, 15, 15, 15), QPageLayout::Millimeter); 印刷プレビュー #include <QPrintPreviewDialog> void MainWindow::printPreview() { QPrinter printer(QPrinter::HighResolution); QPrintPreviewDialog preview(&printer, this); connect(&preview, &QPrintPreviewDialog::paintRequested, this, [this](QPrinter *printer){ ui->plainTextEdit->document()->print(printer); }); preview.exec(); } 保存場所指定 printer.setOutputFileName("/home/user/Documents/sample.pdf"); B. ページ設定のダイアログ #include <QtPrintSupport/QPrinter> #include <QtPrintSupport/QPageSetupDialog> void MainWindow::openPageSetup() { QPrinter printer(QPrinter::HighResolution); QPageSetupDialog dialog(&printer, this); dialog.setWindowTitle("ページ設定"); if (dialog.exec() == QDialog::Accepted) { // OK が押された // printer に設定が反映されている } } QPrinterのインスタンスを流用すれば印刷設定を引き継いで印刷できます。 ...

2026年1月21日