内容简介:最近一入Qt就无法自拔了,为了完工这个项目,连续四五天都是一点多才睡的,加上前前后后调试总共花了我一周时间。主要实现功能有:可多人交互聊天、换肤、C/C++关键字高亮、带编译、可跳转至浏览器。开发环境:初衷:
编辑推荐: |
本文来自于csdn,本文主要通过长期使用Sublime Text3,用一个项目介绍是如何基于Qt的聊天的,希望对您的学习有帮助。 |
最近一入Qt就无法自拔了,为了完工这个项目,连续四五天都是一点多才睡的,加上前前后后调试总共花了我一周时间。主要实现功能有:可多人交互聊天、换肤、C/C++关键字高亮、带编译、可跳转至浏览器。
开发环境:
初衷:
做这个项目的初衷是由于长期使用Sublime Text3,萌生了想自己做一个的想法,并且想在上面添加一些自己想要的功能。不过由于个人能力有限,也删减了许多功能。
需求确定:
1、输入文本
2、保存本地
3、打开本地文件、新建文件
4、换肤
5、实时更新行列号
6、C/C++语法高亮
7、搭建聊天室服务器
8、添加聊天客户端
9、可跳转浏览器
通过将需求罗列,每天完成指定的功能,一方面能合理分配时间,另一方面也能通过各模块实现得到反馈,有继续开发的动力。
下面展示一下界面(有点简单)
1、行列号是通过光标位置来确定的
2、关键字高亮通过调用QRegExp,即正则表达式来匹配关键字符串并上色。
3、从左到右的菜单栏按钮依次是新建文件、保存文件、打开文件、换肤、编译、聊天、和Google。
前面三个功能调用Qt的QFile和QFileDialog头文件中的函数就可以完成。
换肤功能演示:
就是简单的运用信号和槽函数通过切换资源文件名来切换背景图片。
编译演示
运行的是显示当前时间的程序
如果程序出错会提示错误信息
实现原理也很简单,实际上是调用外部进程执行gcc 命令实现的(QProcess)
聊天功能:
首先要先运行服务端创建聊天室,这里采用的TCP/IP协议
客户端可以通过输入IP和账号进行连接(端口已默认设置)
联网功能就是调用URL,实际上就是一个类似超链接的过程,这里就不详细赘述了。
部分实现代码:
关键字高亮类keyhighlight:
头文件
#ifndef KEYHIGHLIGHT_H #define KEYHIGHLIGHT_H #include <QSyntaxHighlighter>//高亮库 #include <QTextCharFormat>//字体格式设置 #include <QTextDocument> #include <QRegExp>//正则表达式 class Keyhighlight : public QSyntaxHighlighter { Q_OBJECT public: Keyhighlight(QTextDocument *parent = 0); void highlightBlock(const QString &text); private: struct HighlightRule { QRegExp pattern; QTextCharFormat format; }; void setNormalFormat(); void setDigitalFormat(); void setFuncFormat(); void setKeywordFormat(); void setStringFormat(); void setCommentFormat(); QVector<HighlightRule> highlightRules;//高亮规则容器 QRegExp commentStartExpression; QRegExp commentEndExpression; //由于高亮设置会依次覆盖前面的 所以越后面优先级越高 QTextCharFormat normalFormat;//普通文本 QTextCharFormat digitalFormat;//数字 QTextCharFormat functionFormat;//函数 QTextCharFormat keywordFormat;//数据类型关键字 QTextCharFormat keywordFormat_two;//流程控制关键字 QTextCharFormat keywordFormat_three;//include关键字 QTextCharFormat stringFormat;//字符串 QTextCharFormat escFormat;//转义字符和占位符 QTextCharFormat singleLineCommentFormat;//单行注释高亮 QTextCharFormat multiLineCommentFormat;//多行注释高亮 }; #endif // KEYHIGHLIGHT_H
实现
#include "keyhighlight.h"
#include<QFont>
#include <QColor>
Keyhighlight::Keyhighlight(QTextDocument *parent)
:QSyntaxHighlighter(parent)
{
setNormalFormat();//高亮的设置会依次覆盖因此越后面的设置优先值越高
setDigitalFormat();
setFuncFormat();
setKeywordFormat();
setStringFormat();
setCommentFormat();
}void Keyhighlight::setNormalFormat()
{
HighlightRule nmrule;//普通文本高亮规则 结构体= pattern + format
QFont nmF("Courier");//字体设置
normalFormat.setFont(nmF);//普通文本格式设置
nmrule.pattern = QRegExp(".+");//正则表达式匹配除\n的所有字符
nmrule.format = normalFormat;
highlightRules.append(nmrule);
}
void Keyhighlight::setDigitalFormat()//数字
{
HighlightRule dgrule;
QFont dgtF("Courier");
digitalFormat.setFont(dgtF);
digitalFormat.setForeground(QColor(128,0,128));//设置颜色为紫色
dgrule.pattern = QRegExp("[0-9]+");//0-9数字正则匹配
dgrule.format = digitalFormat;
highlightRules.append(dgrule);
}
void Keyhighlight::setFuncFormat()//函数名
{
HighlightRule funrule;
QFont funF("Courier");
functionFormat.setFont(funF);
functionFormat.setForeground(QColor(0,255,0));//设置颜色为绿色
funrule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");//正则匹配()前的标识符即函数名
funrule.format = functionFormat;
highlightRules.append(funrule);
}
void Keyhighlight::setKeywordFormat()//关键字的正则匹配
{
HighlightRule keyrule;
QFont keyF("Courier");
keywordFormat.setFont(keyF);
keywordFormat.setForeground(QColor(0,191,255));//蓝色
QStringList keywordPatterns;
keywordPatterns << "\\bchar\\b" << "\\bclass\\b" <<
"\\bdouble\\b"
<< "\\benum\\b" << "\\bexplicit\\b"<<
"\\bint\\b"
<< "\\blong\\b" << "\\bshort\\b" << "\\bstruct\\b"
<< "\\btypedef\\b" << "\\btypename\\b"<< "\\bunion\\b"
<< "\\bunsigned\\b" << "\\bvoid\\b"<< "\\bauto\\b"<<"\\btemplate\\b";//数据类型关键字
foreach (const QString &pattern, keywordPatterns)
{
keyrule.pattern = QRegExp(pattern);
keyrule.format = keywordFormat;
highlightRules.append(keyrule);
}
HighlightRule key2rule;
QFont key2F("Courier");
keywordFormat_two.setFont(key2F);
keywordFormat_two.setForeground(QColor(255,0,0));//红色
QStringList keywordPatterns2;
keywordPatterns2 <<"\\bfor\\b"<<"\\bif\\b"<<"\\belse\\b"<<"\\bwhile\\b"
<<"\\bbreak\\b"
<<"\\bcontinue\\b"<<"\\bgoto\\b"<<"\\bswitch\\b"<<"\\
bcase\\b"
<<"\\bdefault\\b"<<"\\breturn\\b"<<"\\bconst\\b"<<"\\
bstatic\\b"
<<"\\bextern\\b"<<"\\bregister\\b"<<"\\bsizeof\\b"<<"
\\bvolatile\\b"
<<"\\bexplicit\\b"<<"\\boperator\\b"<<"\\btypename\\b"
<<"\\bfriend\\b"
<<"\\binline\\b"<<"\\busing\\b"<<"\\bvirtual\\b";
foreach (const QString &pattern, keywordPatterns2)
{
key2rule.pattern = QRegExp(pattern);
key2rule.format = keywordFormat_two;
highlightRules.append(key2rule);
}
HighlightRule key3rule;
QFont key3F("Courier");
keywordFormat_three.setFont(key3F);
keywordFormat_three.setForeground(QColor(255,0,0));
key3rule.pattern = QRegExp("#include\s*");
key3rule.format = keywordFormat_three;
highlightRules.append(key3rule);
}
void Keyhighlight::setStringFormat()//字符串
{
HighlightRule strrule;
QFont strF("Courier");
stringFormat.setFont(strF);
stringFormat.setForeground(QColor(255,140,0));//黄色
//正则匹配两个引号或三角括号之间的字符串
strrule.format = stringFormat;
highlightRules.append(strrule);
}
void Keyhighlight::setCommentFormat()//注释
{
HighlightRule cmtrule;
singleLineCommentFormat.setForeground(QColor(192,192,192));
//灰色
cmtrule.pattern = QRegExp("//[^\n]*");
cmtrule.format = singleLineCommentFormat;
highlightRules.append(cmtrule);
multiLineCommentFormat.setForeground(QColor(192,192,192));
commentStartExpression = QRegExp("/\\*");
//多行注释正则匹配开始字符
commentEndExpression = QRegExp("\\*/");//结束字符
}void Keyhighlight::highlightBlock(const QString &text)//text是单行传入的
{
foreach(const HighlightRule & rule,highlightRules)
{
QRegExp expression(rule.pattern);
int index = expression.indexIn(text);
while(index >= 0)
{
int length = expression.matchedLength();
setFormat(index,length,rule.format);
index = expression.indexIn(text,index+length);
}
}
setCurrentBlockState(0);
int startIndex = 0;
if (previousBlockState() != 1)
startIndex = commentStartExpression.indexIn(text);
while (startIndex >= 0)
{
int endIndex = commentEndExpression.indexIn(text, startIndex);
int commentLength;
if (endIndex == -1)
{
setCurrentBlockState(1);
commentLength = text.length() - startIndex;
}
else
{
commentLength = endIndex - startIndex + commentEndExpression.matchedLength();
}
setFormat(startIndex, commentLength, multiLineCommentFormat);
startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
}
}
编译功能实现
void MainWindow::onBuild() { onSaveFile();//先保存文件 if("" == getOpenFilePath()) return;//如果仍然不保存则直接返回 QProcess *p = new QProcess;//创建进程执行外部程序 QStringList arg1; arg1 << getOpenFilePath(); arg1 << "-std=gnu99"; p->start("gcc",arg1/*QStringList() << getOpenFilePath()*/);//gcc filename p->waitForFinished();//等待结束 QString s = QString::fromLocal8Bit((p->readAllStandardError()));//从本地字符集GB到Unicode的转换,获取错误信息 if(s == "")//如果错误信息为空则说明没有错 { QProcess *p2 = new QProcess;//创建进程执行./a.out p2->start("./a.out"); p2->waitForFinished(); s += QString::fromLocal8Bit(p2->readAllStandardOutput()); delete p2; } QWidget* wd = new QWidget;//新建窗口 QTextEdit* te = new QTextEdit(wd);//新建文本存放编译结果字符串 QGridLayout *grid = new QGridLayout;//添加新布局 grid->addWidget(te,0,0); wd->setWindowTitle("编译结果"); wd->setLayout(grid);//布局 te->setPlainText(s);//设置文本 te->show(); wd->show(); delete p; }
对此项目感兴趣可移步此处。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- CodeMirror 5.37.0 发布,多功能在线代码编辑器
- CodeMirror 5.38.0 发布,多功能在线代码编辑器
- CodeMirror 5.58.0 发布,多功能在线代码编辑器
- CodeMirror 5.39.0 发布,多功能在线代码编辑器
- CodeMirror 5.39.2 发布,多功能在线代码编辑器
- CodeMirror 5.59.0 发布,多功能在线代码编辑器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Cult of the Amateur
Andrew Keen / Crown Business / 2007-6-5 / USD 22.95
Amateur hour has arrived, and the audience is running the show In a hard-hitting and provocative polemic, Silicon Valley insider and pundit Andrew Keen exposes the grave consequences of today’s......一起来看看 《The Cult of the Amateur》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
HTML 编码/解码
HTML 编码/解码