如何添加行号:QTextEdit?

时间:2010-03-14 19:05:05

标签: c++ ide qt4

我正在编写一个视觉基本ide,我需要在 QTextEdit 中添加行号并突出显示当前行。我找到了这个tutorial,但它是用java编写的,我用c ++编写我的项目 那么在c ++中哪里可以找到这样的教程,或者是否有可以使用的组件?

谢谢。

3 个答案:

答案 0 :(得分:18)

我知道Qt教程建议使用QPlainTextEdit进行文本编辑器实现,而问题(标题中提到的除外)比处理(绝对)更常见QTextEdit小部件,但我成功实现了行为(行号+当前行号突出显示),我认为这可能对某些人(像我一样)有用,他们真的想继续使用{{1}小部件,并希望分享我的实现(这远非完美 - 非常快速编码......)。

LineNumberArea.h: (与“QPlainTextEdit”教程相同)

Rich Text

LineNumberArea.cpp: (与“QPlainTextEdit”教程相同)

class LineNumberArea : public QWidget
{
    Q_OBJECT

public:
    LineNumberArea(QTextEdit *editor);

    QSize sizeHint() const;

protected:
    void paintEvent(QPaintEvent *event);

private:
    QTextEdit *codeEditor;
};

<强>&GT;&GT; qtextedithighlighter.h:

LineNumberArea::LineNumberArea(QTextEdit *editor) : QWidget(editor) {
    codeEditor = editor;
}

QSize LineNumberArea::sizeHint() const {
    return QSize(((QTextEditHighlighter *)codeEditor)->lineNumberAreaWidth(), 0);
}

void LineNumberArea::paintEvent(QPaintEvent *event) {
    ((QTextEditHighlighter *)codeEditor)->lineNumberAreaPaintEvent(event);
}

<强>&GT;&GT; qtextedithighlighter.cpp:

class QTextEditHighlighter : public QTextEdit
{
    Q_OBJECT

public:

    explicit QTextEditHighlighter(QWidget *parent = 0);

    int getFirstVisibleBlockId();
    void lineNumberAreaPaintEvent(QPaintEvent *event);
    int lineNumberAreaWidth();

signals:


public slots:

    void resizeEvent(QResizeEvent *e);

private slots:

    void updateLineNumberAreaWidth(int newBlockCount);
    void updateLineNumberArea(QRectF /*rect_f*/);
    void updateLineNumberArea(int /*slider_pos*/);
    void updateLineNumberArea();

private:

    QWidget *lineNumberArea;

};

希望这可以帮助...

答案 1 :(得分:15)

答案 2 :(得分:0)

我一直在寻找QTextEdit(而不是QPlainTextEdit)的行号绘制解决方案,并且我发现前面的示例代码对QTextEdit的回答很有用,但是当我们在QTextEdit的关联SyntaxHighligher中设置自定义行高时,它不起作用可靠地。

为解决该问题,我想出了一种使用以下代码确定每个块的y坐标的简单方法:

cap production deploy

然后我们可以通过以下方式绘制每个块的行号:

// Here is the key to obtain the y coordinate of the block start
QTextCursor blockCursor(block);
QRect blockCursorRect = this->cursorRect(blockCursor);

这似乎比通过增加先前的块高来计算块y坐标要简单和可靠得多。

希望它对正在寻找类似解决方案的人有所帮助。