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

Posted

技术标签:

【中文标题】GTKmm 进入控制台输出滞后 1 个字符【英文标题】:GTKmm entry to console output lags 1 character 【发布时间】:2020-10-21 21:35:02 【问题描述】:

所以我正在尝试制作一个程序,它复制 Gtk::Entry 的输入并将其输出到控制台。但是,目前当我输入第一个字符时,什么也没有发生。一旦我输入第二个字符,第一个字符就会被打印出来,一旦我输入第三个字符,前两个字符就会被打印出来。当我输入第 4 个字符时,会打印前 3 个字符。我想要这样当我输入第一个字符时,第一个字符被打印,一旦我输入第二个字符,前两个被打印,依此类推。

这是我当前的 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。 默认处理程序将击键转换为字符并将其添加到Entry 中的文本中。

当然,如果您在将字符添加到文本之前抓取文本,那么您将不会抓取该字符。您必须等到添加角色之后。

您的回调在默认处理程序之前运行的原因是您将false 指定为after 的参数connect()。如果您省略此参数或指定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;

【讨论】:

很好的答案。如果您向 OP 解释默认处理程序的区别/含义是什么,这可能会非常有帮助 =>>“您的回调在默认处理程序之前运行的原因是您指定了 false”。 @Michi 我不明白你的意思。对于“差异”:默认处理程序与其他处理程序之间的差异?对于“意义”:除了默认处理程序“将击键转换为字符并将其添加到Entry 中的文本”的过程之外,还有什么其他定义会有所帮助? 我的意思是这样的?

以上是关于GTKmm 进入控制台输出滞后 1 个字符的主要内容,如果未能解决你的问题,请参考以下文章

C++ GTKmm - 如何获取我的 TextView (TextBuffer) 的内容

c语言中,puts和printf函数有啥区别?

控制台程序设计

滞后环节对系统的影响

console.log() 在浏览器控制台输出特殊字符编码的图案

具有并发输入/输出流的 Java 进程