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



所以我正在尝试制作一个程序,它复制Gtk::Entry的输入并将其输出到控制台。然而,目前当我输入第一个字符时,什么都没有发生。一旦我输入第二个字符,第一个字符就会被打印出来,一旦我输入了第三个字符,前两个字符就会打印出来。当我输入第4个字符时,会打印出前3个字符。我希望当我输入第一个字符时,第一个字符就会被打印出来,一旦我输入第二个字符,第一个2就会被打印出去,以此类推

这是我当前的输入框.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指定为connect()after参数。如果您省略了此参数或指定了true,则默认处理程序将在您的处理程序之前运行。当然,默认的处理程序可能会认为该事件已被完全处理,并阻止在它之后运行的处理程序

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

bool inputBox::on_key_press_event(GdkEventKey * key_event)
{
// Start with the default processing.
bool retval = Gtk::Entry::on_key_press_event(key_event);

// Now your functionality:
huidigeInput = get_text();
std::cout << huidigeInput;
set_text("");

// Preserve what the default processing wanted to return.
return retval;
}

最新更新