gtkmm:如何检测箭头键是否被按下

3

当用户在窗口中时,我应该连接哪个事件以检测箭头键是否被按下。

到目前为止,我已经尝试通过on_key_press_event连接,并检查了keyvalhardware_keycodestate

#include <gtkmm.h>
#include <iostream>

class MyWindow : public Gtk::Window
{
public:
    MyWindow();
    bool onKeyPress(GdkEventKey*);
};

MyWindow::MyWindow()
{
    set_title("arrow_button_test");
    this->signal_key_press_event().connect( sigc::mem_fun( *this, &MyWindow::onKeyPress ) );
}

bool MyWindow::onKeyPress(GdkEventKey* event)
{
    std::cout << event->keyval << ' ' << event->hardware_keycode << ' ' << event->state << std::endl;

    return false;
}

int main(int argc, char** argv)
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "com.almost-university.gtkmm.arrow_button_press");

    MyWindow window;    

    app->run(window);

    return 0;
}

这段代码在箭头键上没有生成任何输出,这意味着事件甚至都没有被触发。

2
下投票有什么意义呢?至少请评论并告诉我应该如何改进问题。我已经搜索过了,之前没有类似的问题,并且从阅读文档中也不清楚。我还提供了代码和我的推理。 - v010dya
1个回答

4

如果您更改了

this->signal_key_press_event().connect(
    sigc::mem_fun(*this, &MyWindow::onKeyPress));

为了

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

你的信号处理程序应该接收到这些事件。那个false参数是用来控制after标志的。默认情况下,它为true,这意味着其他信号处理程序可能会在MyWindow::onKeyPress之前拦截该信号,因为它是最后一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接