gtkmm:如何检测箭头键是否被按下
gtkmm: How to detect arrow key is pressed
当用户处于 window.
时,我可以连接到什么事件来检测按下箭头键
到目前为止,我已经尝试通过 on_key_press_event
进行连接,并且我检查了 keyval
、hardware_keycode
和 state
。
#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;
}
此代码不会在箭头键上生成任何输出,这意味着事件甚至不会被触发。
如果你改变
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
之前的信号,因为它是最后一个。
当用户处于 window.
时,我可以连接到什么事件来检测按下箭头键到目前为止,我已经尝试通过 on_key_press_event
进行连接,并且我检查了 keyval
、hardware_keycode
和 state
。
#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;
}
此代码不会在箭头键上生成任何输出,这意味着事件甚至不会被触发。
如果你改变
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
之前的信号,因为它是最后一个。