我正在编写一个视觉基本ide,我需要在 QTextEdit 中添加行号并突出显示当前行。我找到了这个tutorial,但它是用java编写的,我用c ++编写我的项目 那么在c ++中哪里可以找到这样的教程,或者是否有可以使用的组件?
谢谢。
答案 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)
这是C ++中的等效教程:
Qt4:http://doc.qt.io/qt-4.8/qt-widgets-codeeditor-example.html
Qt5:http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html
答案 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坐标要简单和可靠得多。
希望它对正在寻找类似解决方案的人有所帮助。