Qt自制IDE实现断点标记(使用Qscitinlla)

QScintilla是Scintilla在QT上的移植,Scintilla是一个免费的源代码编辑控件。在普通的的文本编辑控件中能看到的功能,Scintilla都完全能够实现,而且,它还能够提供很多编辑和调试源代码时有用的特殊功能。包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。

Scintilla官网:https://www.scintilla.org/

入门与安装可以参考:Qt 开源控件之Qscitinlla代码编辑器入门。这篇教程里可以改进的是,将QScintilla-2.11.5直接放到你的工程文件夹底下,向.pro文件里添加路径时使用$$PWD表示当前目录的绝对路径,然后添加来自QScintilla的头文件和动态链接库。这样项目移动之后也可以正常使用。

INCLUDEPATH += $$PWD/QScintilla-2.11.5/Qt4Qt5
LIBS += -L$$PWD/QScintilla-2.11.5/build-qscintilla-Desktop_Qt_5_9_0_MinGW_32bit-Debug/debug/ -lqscintilla2_qt5d

如果使用release方式构建qscintilla,生成的是qscintilla2_qt5.lib;如果使用debug方式构建qscintilla,生成的是qscintilla2_qt5d.lib(多了一个d)。引用release方式构建生成的qscintilla2_qt5.lib,项目本身最好也使用release方式构建,不然可能构建报错;debug同理。

很多教程讲了如何使用Qscitinlla实现语法高亮、语法分析、自动补全等功能,但没有具体讲如何实现断点标记。我在看了Qt开源编辑器qsciscintilla的一些用法Scintilla开源库使用指南(二)后,加上自己的实践,总结一下如何实现断点标记。

首先,我们new一个qscintilla,在它的margin处设置两条页边,左边的显示行号,右边的供我们打断点。

    editor=new QsciScintilla(this);

    //行号提示
    editor->setMarginType(0,QsciScintilla::NumberMargin);//设置0号页边显示行号
    editor->setMarginLineNumbers(0,true);//对0号页边启用行号
    editor->setMarginWidth(0,30);//设置页边宽度

    editor->setMarginType(1,QsciScintilla::SymbolMargin); //设置1号页边显示符号
    editor->SendScintilla(QsciScintilla::SCI_MARKERSETFORE, 1,QColor(Qt::black)); //置标记前景和背景标记
    editor->SendScintilla(QsciScintilla::SCI_MARKERSETBACK, 1,QColor(Qt::red));

    editor->SendScintilla(QsciScintilla::SCI_SETMARGINMASKN,1,0x02); //1号页边显示2号标记

    editor->SendScintilla(editor->SCI_SETMARGINSENSITIVEN,1,true); //设置1号页边可以点击

然后,我们创建一个connect,接收editor的margin被点击的信号,使用自定义的槽函数在相应位置打一个断点。

 connect(editor,SIGNAL(marginClicked(int,int,Qt::KeyboardModifiers)),this,SLOT(addMarker(int,int,Qt::KeyboardModifiers)));

自定义槽函数如下:

void Debugger::addMarker(int m, int n, Qt::KeyboardModifiers)
{
    //m为被点击的页边的编号(列),n为行
    int maskn=editor->SendScintilla(QsciScintilla::SCI_MARKERGET,n); 
    //qDebug()<<n<<endl;
    if(maskn == 0)
    {
        editor->SendScintilla(QsciScintilla::SCI_MARKERADD,n,m);
        QString str = "break "+QString::number(n+1)+"\r\n";
        //qDebug()<<str;
        cmd->write(str.toStdString().c_str());
    }
    else
    {
        //editor->SendScintilla(QsciScintilla::SCI_MARKERDELETE,n,m);
    }
}

这样简单的打断点就实现了。如果想详细的了解如何消除断点,进一步如何实现debug功能等,可以查看github上的完整源代码

这是一个完整的IDE,由于是一个仓促完成的课程作业,还有很多不完美的地方。其中debug窗口的实现参见Debugger类。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt是一个跨平台的C++库,可以用来实现各种类型的应用程序,包括网络应用程序。要实现断点续传服务器,首先需要使用Qt的网络模块来创建一个服务器程序,然后在服务器程序中实现断点续传的逻辑。 首先,我们需要创建一个QTcpServer对象来监听客户端的连接请求。当有客户端连接上来时,我们可以创建一个QTcpSocket对象来处理和该客户端的通信。 在断点续传服务器中,我们需要实现一个文件传输的功能。当客户端发送请求下载一个文件时,服务器首先需要检查这个文件是否支持断点续传。如果支持断点续传,服务器需要告知客户端支持的范围,并发送文件的部分内容。如果客户端在传输中断开连接,那么服务器需要记录传输的断点,以便客户端下次连接可以继续传输。 在Qt中,我们可以使用QFile和QIODevice来实现文件传输的逻辑。通过QFile可以读取文件内容,而QIODevice可以作为网络数据的传输通道。当服务器接收到客户端的数据时,可以使用QFile来保存文件内容,并且可以通过QIODevice来发送文件内容给客户端。 当客户端下载文件时,我们还可以使用QNetworkReply类来实现断点续传的过程。通过QNetworkReply可以获取服务器的响应信息,并且可以设置客户端的请求范围。 通过Qt的网络模块和文件操作类,可以比较方便地实现断点续传服务器。当然,在实际开发中,还需要考虑到数据安全、断点记录和恢复等方面的问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值