问题描述
所以我试图制作一个程序,该程序复制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问题!
解决方法
让我们看看触发按键事件时的一系列动作。
- 您的回调函数将抓取
Entry
中的文本并将其发送到std::cout
。 - 默认处理程序将击键转换为字符并将其添加到
Entry
中的文本中。
自然地,如果您在文本之前添加了字符 ,则不会捕获该字符。您必须等到添加字符之后。
您的回调在默认处理程序之前运行的原因是,您将false
指定为after
的{{1}}参数。如果省略此参数或指定connect()
,则默认处理程序将在您之前运行。当然,默认处理程序可能会认为事件已得到完全处理,并且阻止了在该事件之后运行的处理程序。
为确保获得所需的行为,覆盖虚拟函数true
可能比显式连接到on_key_press_event()
更好。这样,您就可以在默认处理返回其值之前插入代码。
signal_key_press_event()