用QT写了一个练手的文本编辑器,想实现一个根据用户输入文本随时显示字符个数的功能。开始的想法是用一个线程,每次读取QTextEdit中所有的文本然后再用一个循环判断计数,但是这个方法的问题在于如果文本规模过大会造成字符数目更新延迟,后来想到可以用一个QTextCursor标兵,这个标兵一直保存着上一次线程执行的时候的QTextEdit的结尾位置,这样本次线程启用的时候,如果相比于上次线程调用的时候向QTextEdit中写入了字符,那么就可以通过将标兵移动到本次QTextEdit结尾处并标记,然后通过SelectedText方法即可得到本次相对于上次多出来的字符串,这样即使文本过多每次也只用读取规模较小的字符串,保证了速度,但是问题在于,我每次执行线程的时候,移动光标后得到的字符串总是为空串,本人QT初学者,还要请教各位大佬了。代码如下:
DWORD WINAPI GetBytes(LPVOID p){
//参数p为控件的指针,其中edit成员指针为QTextEdit控件的指针
Text *this1=(Text *)p;
string tempS;
int CharN=0;
while(1){
//tc为包含QTextEdit控件类的成员变量,在该控件类构造函数中已经初始化了
this1->tc.movePosition(QTextCursor::End,QTextCursor::KeepAnchor);
//问题在这里,tempS的值始终为空串
tempS=this1->tc.selectedText().toStdString();
qDebug()<<QString::fromStdString(tempS);
//对Utf-8编码下的英文与汉字的字符计数,与问题无关
for(int i=0;i<tempS.size();){
if((unsigned char)tempS[i]>=0&&(unsigned char)tempS[i]<=127){
if((unsigned char)tempS[i]!=10)
{
CharN++;
i++;
}
else
i++;
}
else{
if((unsigned char)tempS[i]>192)
CharN++;
i++;
while((unsigned char)tempS[i]>127&&(unsigned char)tempS[i]<192)
i++;
}
}
//label设置用于更新字符数
this1->WordsNum->setText(QString::fromStdString(to_string(CharN)));
this_thread::sleep_for(chrono::milliseconds(100));
}
}