hhhhyiuxiu 2020-11-18 02:40 采纳率: 0%
浏览 237

关于QT中光标移动的问题

用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));
    }
}

 

  • 写回答

2条回答 默认 最新

  • tomwillow 2020-11-18 16:17
    关注

    搞太复杂了。以WinSDK的观点来看,文本框改变内容有几个途径:WM_PASTE, WM_KEYDOWN, WM_CHAR。把对文本框做控件子类化,截获这几个消息时统计字数即可。这样不用开多的线程,而且也能保证内容一旦变化更新字数统计,不变化不产生多余开销。

    至于QT,QT的类里可以重载这几个消息事件的。重载了做字数统计即可。

    评论

报告相同问题?

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错