qt用调试点编写代码视图

时间:2017-09-20 16:48:33

标签: c++ qt qt5

大家好!

我正在尝试为自己的硬件编写自定义调试器。我遇到的一个问题是我不知道如何实现添加调试点功能。 详细地说,我想在一行中输入(F9),并在左列上标记一个红点。或者,我双击左栏并标记一个红点。

我已经学会了Qt本身提供的代码编辑器示例,但我不知道如何实现我的设计。

一些小例子项目会更好。

红点看起来像这样

1 个答案:

答案 0 :(得分:2)

为简单起见,当点击数字类似于QtCreator的右侧空格时,将添加红色圆圈,以下程序可根据您的具体要求进行推断。

要获得的第一件事是光标相对于编辑器的位置,实际上得到我们想要找到的行所在的高度或矩形,在mousePressEvent的情况下返回的位置相对于绘制数字的小部件的点击,使用此高度,我们可以使用以下算法获取位置,然后在不存在的情况下存储它,或者如果已经存储则将其删除( h 是相对于小部件顶部的位置):

QTextBlock block = firstVisibleBlock();
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top + (int) blockBoundingRect(block).height();

int blockNumber =  block.blockNumber();
while (block.isValid()) {
    if (block.isVisible()) {
        if(h > top && h<bottom){
            int index = breakpoints.indexOf(blockNumber);
            if(index != -1){
                breakpoints.remove(index);
            }
            else
                breakpoints<<blockNumber;
            update();
            return;
        }
    }
    blockNumber++;
    block = block.next();
    top = bottom;
    bottom = top + (int) blockBoundingRect(block).height();
}

然后在绘制数字的方法中,在这种情况下lineNumberAreaPaintEvent,因为我们有块和它们各自的索引,它将被比较,并且如果其中一个存储的数字被绘制。

void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
{
    QPainter painter(lineNumberArea);
    painter.fillRect(event->rect(), Qt::lightGray);

    QTextBlock block = firstVisibleBlock();
    int blockNumber = block.blockNumber();
    int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
    int bottom = top + (int) blockBoundingRect(block).height();

    while (block.isValid() && top <= event->rect().bottom()) {
        if (block.isVisible() && bottom >= event->rect().top()) {
            QString number = QString::number(blockNumber + 1);
            //add next lines
            if(breakpoints.indexOf(blockNumber) != -1){
                painter.setBrush(Qt::red);
                painter.drawEllipse(0, top + (fontMetrics().height()-width_circle)/2, width_circle, width_circle);
            }
            //end lines
            painter.setPen(Qt::black);
            painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
                             Qt::AlignRight, number);
        }
        block = block.next();
        top = bottom;
        bottom = top + (int) blockBoundingRect(block).height();
        ++blockNumber;
    }
}

下图显示了结果。

enter image description here

完整示例可在以下link中找到。