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

关于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的类里可以重载这几个消息事件的。重载了做字数统计即可。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料