<< QT && C++
80行で折り返すテキストエディットの作り方
よくテキストエディター(TeraPadなど)には80行など決まった行数で折り返す機能がついていることがあります。
そのようなエディターを作る場合、エディター側でいくつかしなくてはならない設定があります。
次の3つが重要ポイントです。
- ウインドウの大きさが変わった時に勝手にresizeしないようにする
- テキストエディットの幅を80行の幅に合わせる
- 文字フォントには等幅フォント(monospaceなど)を使う
これらの条件をもとにしてQTextEditを拡張して80行折り返しのエディットテキストを次のように作成します。
#ifndef MYEDITOR_H #define MYEDITOR_H #include <QTextEdit> class MyEditor : public QTextEdit{ Q_OBJECT public: explicit MyEditor(QWidget* parent) : wrapColumn(80) { fontSize = 10; font = QFont("monospace", fontSize); font.setStyleHint(QFont::TypeWriter); fontPxSize = FontMetrics(font).width('0'); ///1文字分の幅をピクセルで取得 setFont(font); ///フォントをエディターに設定 QString message = "longlonglonglonglong.......................................................................................longlonglongtext"; textCursor().insertText(message); setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); ///折り返しを有効にする setLineWrapMode(QTextEdit::FixedPixelWidth); setLineWrapColumnOrWidth(fontPxSize * wrapColumn); //1行の長さをピクセル単位で指定 resize(fontPxSize * wrapColumn, height()); } ~MyEditor(){} virtual void resizeEvent(QResizeEvent *event){ ///勝手にリサイズしないようにする。 return; } private: QFont font; int fontSize; ///ポイントでのフォントの大きさ int fontPxSize; ///ピクセルでのフォントの大きさ int wrapColumn; ///折り返す文字数 }; #endif // MYEDITOR_H
setLineWrapMode関数にQTextEdit::FixedPixelWidthを渡すことで1行当たりの長さをsetLineWrapColumnOrWidth関数を使ってピクセル単位で指定できます。
フォントにはポイントという単位を使用しているのでピクセルに変換するためには3/4かける必要があります。
この例でカスタムしたQtextEditは次のように80行を超えると自動で折り返しされるようになります。
ここではフォントにmonospaceを使っていますが、等幅フォントならどのフォントでも問題ありません。
以上、80行で折り返すエディターの作り方でした。では、また!
関連項目
© Kaz