• 7796阅读
  • 16回复

[讨论]QTextEdit  append方法  大神求助 [复制链接]

上一主题 下一主题
离线vain2017
 

只看楼主 倒序阅读 楼主  发表于: 2018-11-30
在自己做一个串口助手的时候发现了这样一个现象。每次我接收到串口消息后会调用textEdit的append方法,把新的数据文本添加到文本框。但是这种方法会自动添加新行。比如我的文本框现有内容为“hello,”,再次调用appen(“world”)后,textEdit中的内容会是 "hello,\nworld"而不是"hello,world"。
我尝试了用一些方法解决这个问题,比如insert方法,但是在串口数据量大的时候,这个方法会使得程序卡顿(doenvents也没用),但是append方法却一点也不卡顿。我又尝试将新添加的文本加个退格键‘\b'再调用append方法,发现\b并没有起到退格作用,反而是变成了空格!?  
有没有大神能帮忙解释下为什么退格符会变成空格?还有调用append方法会自动附加新行的问题该怎么解决?都快气哭了。。。。。。
离线九重水

只看该作者 1楼 发表于: 2018-11-30
append是增加一个段落。自己看看append函数的作用。你用错函数了。
你要用insertPlainText函数或相关函数。
离线never_forget

只看该作者 2楼 发表于: 2018-12-01
你也可以先取出来,拼接,清除,然后 append() ;就是比较傻 ~
离线vain2017

只看该作者 3楼 发表于: 2018-12-01
回 never_forget 的帖子
never_forget:你也可以先取出来,拼接,清除,然后 append() ;就是比较傻 ~ (2018-12-01 09:31) 

嗯,这个我也试过了,傻点当然没问题,问题是这种方法也会卡,CPU占用率会飙到很高。
离线vain2017

只看该作者 4楼 发表于: 2018-12-01
回 九重水 的帖子
九重水:append是增加一个段落。自己看看append函数的作用。你用错函数了。
你要用insertPlainText函数或相关函数。 (2018-11-30 11:33) 

嗯,但是其他的函数都很卡。。。那么还有一个问题,为什么我输出退格符会变成空格呢?
离线笑颜

只看该作者 5楼 发表于: 2018-12-01
你可以通过伪造输入事件的方法来添加内容。这种方法,textEdit不能是只读的。
具体代码:
    QInputMethodEvent *event = new QInputMethodEvent;
    event->setCommitString(data);
    qApp->postEvent(ui->textEdit, event);
离线小韩老师

只看该作者 6楼 发表于: 2018-12-01
既然是数据率高,可以尝试使用缓冲区,定时刷新数据
离线九重水

只看该作者 7楼 发表于: 2018-12-01
回 vain2017 的帖子
vain2017:嗯,但是其他的函数都很卡。。。那么还有一个问题,为什么我输出退格符会变成空格呢? (2018-12-01 10:32) 

\b是光标向前移动,不是删除,所以会变成空格。
跟手动按键盘的退格键不同。

moveCursor(QTextCursor::End);
insertPlainText()
适用于处理一段数据。
你可以一段一段处理

该换行的时候,你还是必须适当换行呀,不然它一行一打数据,不知道输出到右边的哪里去了。
数据一大,自然就卡得飞起

而QTextEdit的刷新只关心窗口显示部分,append一下就往下滚,过去的数据不管,它自然不会卡。
离线九重水

只看该作者 8楼 发表于: 2018-12-01
上面有一点讲的不清楚,\b是删除它只是光标往后移动了一下(没有真正删除,它跟我们平时用的编辑器不同,编辑器是做好的完整退格删除功能)
比如cout<<"abc\b",这一行仍然会输出abc,但是它的光标会移动到c的位置。
离线vain2017

只看该作者 9楼 发表于: 2018-12-01
       可是我用纯代码写出来(windows控制台),\b就是正常的退格删除啊,代码如下。不过你的说法大体也能接收,可能Qt内部对退格的认识与windows系统或一般的编译器编辑器不同。但是再怎么不同,变成空格还是让人不能接受。
        对了,谢谢大神那个移动光标的方法,这也是我目前的方法。
        @楼上的 九重水

离线vain2017

只看该作者 10楼 发表于: 2018-12-01
回 笑颜 的帖子
笑颜:你可以通过伪造输入事件的方法来添加内容。这种方法,textEdit不能是只读的。
具体代码:
    QInputMethodEvent *event = new QInputMethodEvent;
    event->setCommitString(data);
    qApp->postEvent(ui .. (2018-12-01 12:43) 

       哇,想不到还有这种方法,果然不同的人想法就是不一样,我会试一下的,谢谢。
离线vain2017

只看该作者 11楼 发表于: 2018-12-01
回 小韩老师 的帖子
小韩老师:既然是数据率高,可以尝试使用缓冲区,定时刷新数据 (2018-12-01 15:35) 

嗯嗯,说的有道理,这个方向忘了考虑了,一直沉浸在找官方的函数和直接可用的方法,钻了牛角了,谢谢。
离线九重水

只看该作者 12楼 发表于: 2018-12-02
回 vain2017 的帖子
vain2017:       可是我用纯代码写出来(windows控制台),\b就是正常的退格删除啊,代码如下。不过你的说法大体也能接收,可能Qt内部对退格的认识与windows系统或一般的编译器编辑器不同。但是再怎么不同,变成空格还是让人不能接受。
     .. (2018-12-01 18:02) 

你看错了,你这串打出来先是hello wo
\b之后,光标移动到w后面,o没有被删除,继续输出rld,
rld会覆盖o直到输出d。
离线vain2017

只看该作者 13楼 发表于: 2018-12-03
哦哦 确实如此 谢谢大神
离线happy_snail

只看该作者 14楼 发表于: 2019-04-01
我也遇到这个问题 怎么解决呀!!!
离线yysr

只看该作者 15楼 发表于: 2019-04-01
更新后的最终数据放到一个字符串变量中,一秒钟用字符串变量中的数据更新一次textEdit
离线diyuanbo

只看该作者 16楼 发表于: 2019-05-20
    QTextCursor tc = this->textCursor();
    tc.movePosition(QTextCursor::End);
    tc.insertText(QString::fromLocal8Bit(data));
快速回复
限100 字节
 
上一个 下一个