80行で折り返すテキストエディットの作り方

よくテキストエディター(TeraPadなど)には80行など決まった行数で折り返す機能がついていることがあります。

そのようなエディターを作る場合、エディター側でいくつかしなくてはならない設定があります。

次の3つが重要ポイントです。

これらの条件をもとにして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行を超えると自動で折り返しされるようになります。

80行あたりで折り返すテキストエディット

ここではフォントにmonospaceを使っていますが、等幅フォントならどのフォントでも問題ありません。

以上、80行で折り返すエディターの作り方でした。では、また!

関連項目
プライバシーポリシー