• Qt::QPlainTextEdit


    class CodeEditor : public QPlainTextEdit
    {
        Q_OBJECT
    
    public:
        CodeEditor(QWidget *parent = nullptr);
    
        void lineNumberAreaPaintEvent(QPaintEvent *event);
        int lineNumberAreaWidth();
    
    protected:
        void resizeEvent(QResizeEvent *event) override;
    
    private slots:
        void updateLineNumberAreaWidth(int newBlockCount);
        void highlightCurrentLine();
        void updateLineNumberArea(const QRect &rect, int dy);
    
    private:
        QWidget *lineNumberArea;
    };
    #include <QPainter>
    #include <QTextBlock>
    CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent)
    {
        lineNumberArea = new LineNumberArea(this);
    
        connect(this, &CodeEditor::blockCountChanged, this, &CodeEditor::updateLineNumberAreaWidth);
        connect(this, &CodeEditor::updateRequest, this, &CodeEditor::updateLineNumberArea);
        connect(this, &CodeEditor::cursorPositionChanged, this, &CodeEditor::highlightCurrentLine);
    
        updateLineNumberAreaWidth(0);
        highlightCurrentLine();
    }
    
    int CodeEditor::lineNumberAreaWidth()
    {
        int digits = 1;
        int max = qMax(1, blockCount());
        while (max >= 10) {
            max /= 10;
            ++digits;
        }
    
        int space = 3 + fontMetrics().horizontalAdvance(QLatin1Char('9')) * digits;
    
        return space;
    }
    
    void CodeEditor::updateLineNumberAreaWidth(int /* newBlockCount */)
    {
        setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
    }
    
    void CodeEditor::updateLineNumberArea(const QRect &rect, int dy)
    {
        if (dy)
            lineNumberArea->scroll(0, dy);
        else
            lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
    
        if (rect.contains(viewport()->rect()))
            updateLineNumberAreaWidth(0);
    }
    
    void CodeEditor::resizeEvent(QResizeEvent *e)
    {
        QPlainTextEdit::resizeEvent(e);
    
        QRect cr = contentsRect();
        lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
    }
    
    void CodeEditor::highlightCurrentLine()
    {
        QList<QTextEdit::ExtraSelection> extraSelections;
    
        if (!isReadOnly()) {
            QTextEdit::ExtraSelection selection;
    
            QColor lineColor = QColor(Qt::yellow).lighter(160);
    
            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);
            selection.cursor = textCursor();
            selection.cursor.clearSelection();
            extraSelections.append(selection);
        }
    
        setExtraSelections(extraSelections);
    }
    
    void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
    {
        QPainter painter(lineNumberArea);
        painter.fillRect(event->rect(), Qt::lightGray);
    
        QTextBlock block = firstVisibleBlock();
        int blockNumber = block.blockNumber();
        int top = qRound(blockBoundingGeometry(block).translated(contentOffset()).top());
        int bottom = top + qRound(blockBoundingRect(block).height());
    
        while (block.isValid() && top <= event->rect().bottom()) {
            if (block.isVisible() && bottom >= event->rect().top()) {
                QString number = QString::number(blockNumber + 1);
                painter.setPen(Qt::black);
                painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
                                 Qt::AlignRight, number);
            }
    
            block = block.next();
            top = bottom;
            bottom = top + qRound(blockBoundingRect(block).height());
            ++blockNumber;
        }
    }
    class LineNumberArea : public QWidget
    {
    public:
        LineNumberArea(CodeEditor *editor) : QWidget(editor), codeEditor(editor)
        {}
    
        QSize sizeHint() const override
        {
            return QSize(codeEditor->lineNumberAreaWidth(), 0);
        }
    
    protected:
        void paintEvent(QPaintEvent *event) override
        {
            codeEditor->lineNumberAreaPaintEvent(event);
        }
    
    private:
        CodeEditor *codeEditor;
    };
    CodeEditor editor;
    editor.setWindowTitle(QObject::tr("Code Editor Example"));
    editor.show();
  • 相关阅读:
    js获取url参数
    Ueditor百度编辑器中的 setContent()方法的使用
    js防止sql注入的参数过滤
    父级元素点击,遮盖了子元素的点击
    input onchange事件
    jq选择子元素
    nodejs mysql 执行多条sql语句
    java.util.ConcurrentModificationException
    Group by与having理解
    ibatis配置xml文件中CDATA的用法
  • 原文地址:https://www.cnblogs.com/osbreak/p/15733063.html
Copyright © 2020-2023  润新知