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日

Qt6のテキストカーソル移動のイベントは?

QTextEdit / QPlainTextEdit connect(textEdit, &QTextEdit::cursorPositionChanged, this, [](){ qDebug() << "カーソルが移動しました"; }); QLineEdit connect(lineEdit, &QLineEdit::cursorPositionChanged, this, [](int oldPos, int newPos){ qDebug() << oldPos << "->" << newPos; });

2026年1月29日

Qtでフォントのコンボボックスって?

#include <QFontComboBox> #include <QLabel> #include <QVBoxLayout> QFontComboBox *fontBox = new QFontComboBox(this); QLabel *label = new QLabel("サンプルテキスト", this); connect(fontBox, &QFontComboBox::currentFontChanged, this, [=](const QFont &font){ label->setFont(font); }); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(fontBox); layout->addWidget(label); setLayout(layout);

2026年1月25日

QtのQTextEditで選択中のテキストの色やフォントを変更するには?

A. テキストの色を変更 QTextCursor cursor = ui->textEdit->textCursor(); if (cursor.hasSelection()) { QTextCharFormat fmt; fmt.setForeground(Qt::red); // 文字色 cursor.mergeCharFormat(fmt); } B. フォントを変更 QTextCharFormat fmt; fmt.setFontFamily("Consolas"); fmt.setFontPointSize(14); fmt.setFontWeight(QFont::Bold); fmt.setFontItalic(true); cursor.mergeCharFormat(fmt);

2026年1月25日

Qtのダイアログで返り値を渡すには?

QDialog::accept() / reject() 最も一般的な方法。 // MyDialog.h class MyDialog : public QDialog { Q_OBJECT public: explicit MyDialog(QWidget *parent = nullptr); QString resultText() const { return m_result; } private slots: void onOkClicked(); private: QString m_result; }; // MyDialog.cpp MyDialog::MyDialog(QWidget *parent) : QDialog(parent) { auto *edit = new QLineEdit(this); auto *button = new QPushButton("OK", this); connect(button, &QPushButton::clicked, this, &MyDialog::onOkClicked); } void MyDialog::onOkClicked() { m_result = "ユーザーが入力した値"; // 何でも保存できる accept(); // ← ダイアログを閉じて OK を返す } 呼び出し側 MyDialog dlg; if (dlg.exec() == QDialog::Accepted) { QString value = dlg.resultText(); ... }

2026年1月21日

Qtでウィンドウが開かれてから処理を行うには?

Windowのコンストラクタ(初期化関数)にぶち込んでおけばいいです。 QTimer::singleShot(0, this, [this](){ qDebug() << "表示されてから処理されます" });

2026年1月21日

Qtでアプリが終了させられるときにダイアログを表示するには?

A. closeEvent() をオーバーライドする ウィンドウが閉じられる直前に呼ばれます。 ここでダイアログを出して、終了をキャンセルできます。 例:終了確認ダイアログ // MainWindow.h protected: void closeEvent(QCloseEvent *event) override; // MainWindow.cpp #include <QCloseEvent> #include <QMessageBox> void MainWindow::closeEvent(QCloseEvent *event) { auto ret = QMessageBox::question( this, "終了確認", "アプリを終了しますか?", QMessageBox::Yes | QMessageBox::No ); if (ret == QMessageBox::Yes) { event->accept(); // 終了OK } else { event->ignore(); // 終了キャンセル } } B. QCoreApplication::aboutToQuit 終了をキャンセルすることはできません 処理だけしたい場合に使います。 connect(qApp, &QCoreApplication::aboutToQuit, this, [](){ qDebug() << "アプリ終了直前"; });

2026年1月21日

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日

Qtで高速でウィジェットを切り替えるには?

今回は、同じ場所に設置されているウィジェットを切り替える方法を紹介します。 QStackedWidget *stack = new QStackedWidget(this); stack->addWidget(page1); stack->addWidget(page2); stack->addWidget(page3); // 切り替え stack->setCurrentIndex(1); QStackedWidgetを使えば、簡単に切り替えできます。 しかも、メモリにもCPUにも優しいです。

2026年1月14日

QtのQPushButtonにJSのホバーみたいなイベントを実装するには?

シグナルでのJSのホバーイベントみたいなやつはなかったようなので、 以下の方法で、JSのmouseenter、mouseoverみたいなやつを実装します。 結論 : サブクラスでオーバーライド class HoverButton : public QPushButton { Q_OBJECT public: using QPushButton::QPushButton; protected: void enterEvent(QEnterEvent* event) override { qDebug() << "hover enter"; QPushButton::enterEvent(event); } void leaveEvent(QEvent* event) override { qDebug() << "hover leave"; QPushButton::leaveEvent(event); } }; おまけ : シグナル付き ホバーの実装例 : class HoverButton : public QPushButton { Q_OBJECT public: using QPushButton::QPushButton; protected: void enterEvent(QEnterEvent* event) override { emit mouseEnter(); QPushButton::enterEvent(event); } void leaveEvent(QEvent* event) override { emit mouseOver(); QPushButton::leaveEvent(event); } signals: void mouseEnter(); void mouseOver(); }; 接続、connect例 : ...

2026年1月13日