大家好!
我正在尝试为自己的硬件编写自定义调试器。我遇到的一个问题是我不知道如何实现添加调试点功能。 详细地说,我想在一行中输入(F9),并在左列上标记一个红点。或者,我双击左栏并标记一个红点。
我已经学会了Qt本身提供的代码编辑器示例,但我不知道如何实现我的设计。
一些小例子项目会更好。
红点看起来像这样
答案 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;
}
}
下图显示了结果。
完整示例可在以下link中找到。