QString strFirst(szText);
stringToHtmlFilter(strFirst);
stringToHtml(strFirst,clrB);
ui->textEdit_SQL->insertHtml(strFirst);
由于项目需要,需要在界面上显示出软件运行过程中的各种日志。
运行过程在B类中,而界面显示在A类中。textEdit就放在A类中。
可以通过qt中的信号槽机制,在B类中设置信号,A类中设置槽函数。用来接收相应的
结果。通过textEdit->append(s);将结果输出到textEdit中,s即为运行中的日志。
append函数将自动实现换行。
后来又提出了异常日志和正常日志用不同的颜色显示。
参考博客http://blog.sina.com.cn/s/blog_9da24f3b0101jz1w.html
我的实现方法是
//异常日志输出,增加一个参数与正常日志输出对比 void MainWindow::changetext(int m, QString s, int n) { QColor clrR(255,0,0);//红色 stringToHtmlFilter(s); stringToHtml(s,clrR); textEdit[m]->append(""); textEdit[m]->insertHtml(s); } //正常日志输出 void MainWindow::changeText(int m, QString s) { QColor clrR(0,0,0);//黑色 stringToHtmlFilter(s); stringToHtml(s,clrR); textEdit[m]->insertHtml(s); } //根据html标记语言,将QString转化: void MainWindow::stringToHtml(QString &str, QColor crl) { QByteArray array; array.append(crl.red()); array.append(crl.green()); array.append(crl.blue()); QString strC(array.toHex()); str = QString("<span style=\" color:#%1;\">%2</span>").arg(strC).arg(str); } //由于html的特性,会导致一些特殊字符不能显示,例如用于标记的‘<’‘>’、空格,换行等。所以第一步需要对待添加的QString进行转化,转化成html支持的文本方式。使用如下函数 void MainWindow::stringToHtmlFilter(QString &str) { //注意这几行代码的顺序不能乱,否则会造成多次替换 str.replace("&","&"); str.replace(">",">"); str.replace("<","<"); str.replace("\"","""); str.replace("\'","'"); str.replace(" "," "); str.replace("\n","<br>"); str.replace("\r","<br>"); }
在使用过程中,我发现当异常日志输出后,其后的所有正常日志也变为红色。原来是正常日志输出我只使用了append函数
所以改变正常日志的输出代码
//正常日志的输出时也设置一下格式就好了 void MainWindow::changeText(int m, QString s) { QColor clrR(0,0,0); stringToHtmlFilter(s); stringToHtml(s,clrR); textEdit[m]->insertHtml(s); }
设置完后又发现新问题,那就是所有日志是一行输出来的,没有实现换行,在异常日志输出前后增加append函数,正常日志输出后增加append函数。函数参数为空即可。
//正常日志输出
void MainWindow::changeText( int m, QString s)
{
QColor clrR(0,0,0);
stringToHtmlFilter(s);
stringToHtml(s,clrR);
textEdit[m]->insertHtml(s);
textEdit[m]->append( "" );
}
//异常日志输出
void MainWindow::changetext( int m, QString s, int n)
{
QColor clrR(255,0,0);
stringToHtmlFilter(s);
stringToHtml(s,clrR);
textEdit[m]->append( "" );
textEdit[m]->insertHtml(s);
//m_TextBrowser->insertHtml(str);
textEdit[m]->append( "" );
}
|
这样就可以按要求输出了。在测试的时候不小心鼠标点了一下日志窗口,结果发现所有日志都在我点击过得地方输出了,完全乱了顺序。
所以在日志输出后增加一个设置光标的代码就好了。
最终版代码为
//正常日志输出
void MainWindow::changeText( int m, QString s)
{
QColor clrR(0,0,0);
stringToHtmlFilter(s);
stringToHtml(s,clrR);
textEdit[m]->insertHtml(s);
textEdit[m]->append( "" );
textEdit[m]->moveCursor(QTextCursor::End); //光标移动到textedit内容的末尾
}
//异常日志输出
void MainWindow::changetext( int m, QString s, int n)
{
QColor clrR(255,0,0);
stringToHtmlFilter(s);
stringToHtml(s,clrR);
textEdit[m]->append( "" );
textEdit[m]->insertHtml(s);
//m_TextBrowser->insertHtml(str);
textEdit[m]->append( "" );
textEdit[m]->moveCursor(QTextCursor::End);
}
|