GTKmm输入到控制台输出滞后1个字符

问题描述

所以我试图制作一个程序,该程序复制Gtk :: Entry的输入并将其输出到控制台。但是,目前,当我输入第一个字符时,什么也没有发生。输入第二个字符后,第一个字符被打印,输入第三个字符后,前两个字符被打印。当我输入第四个字符时,将打印前三个字符。我希望这样,以便当我输入第一个字符时,第一个字符被打印,一旦输入第二个字符,则前两个字符被打印,依此类推。

这是我当前的inputbox.cpp

#include "inputbox.h"
#include <iostream>

inputBox::inputBox(){
    this->signal_key_press_event().connect(sigc::mem_fun(*this,&inputBox::onKeyPress),false);
}

bool inputBox::onKeyPress(GdkEventKey* event){
    huidigeInput = get_text();
    std::cout << huidigeInput;
    set_text("");
    return false;
}

这是我的inputbox.h文件

class inputBox : public::Gtk::Entry{
public:
    inputBox();
    bool onKeyPress(GdkEventKey*);

    Glib::ustring huidigeInput;
};

我希望有人能找到bug问题!

解决方法

让我们看看触发按键事件时的一系列动作。

  1. 您的回调函数将抓取Entry中的文本并将其发送到std::cout
  2. 默认处理程序将击键转换为字符并将其添加到Entry中的文本中。

自然地,如果您在文本之前添加了字符 ,则不会捕获该字符。您必须等到添加字符之后。

您的回调在默认处理程序之前运行的原因是,您将false指定为after的{​​{1}}参数。如果省略此参数或指定connect(),则默认处理程序将在您之前运行。当然,默认处理程序可能会认为事件已得到完全处理,并且阻止了在该事件之后运行的处理程序。

为确保获得所需的行为,覆盖虚拟函数true可能比显式连接到on_key_press_event()更好。这样,您就可以在默认处理返回其值之前插入代码。

signal_key_press_event()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...