我想知道为什么GtkButton的按钮释放事件不会被鼠标左键单击触发。在以下代码中(使用gtkmm3),按钮会在左键单击时触发单击的事件,并在使用任何其他鼠标按钮单击时触发按钮释放事件。我想确定在单击按钮时是否按下了任何修改键,因此我需要按钮释放事件提供的附加信息。有没有办法让它在左键点击时触发?
#include <iostream>
#include <gtkmm.h>
void clicked()
{
std::cout << "clicked" << std::endl;
}
bool button_released( GdkEventButton* evt )
{
std::cout << "button released" << std::endl;
return false;
}
int main( int argc, char* argv[] )
{
Glib::RefPtr<Gtk::Application> app =
Gtk::Application::create( argc, argv, "org.gtkmm.examples.base" );
Gtk::Window window;
window.set_default_size( 300, 200 );
Gtk::Button* btn = Gtk::manage( new Gtk::Button( "Click me!" ) );
btn->add_events( Gdk::BUTTON_RELEASE_MASK );
btn->signal_clicked().connect( sigc::ptr_fun( clicked ) );
btn->signal_button_release_event().connect( sigc::ptr_fun( button_released ) );
window.add( *btn );
window.show_all();
return app->run( window );
}
答案 0 :(得分:0)
按钮实现处理按钮释放事件本身(如果它是主鼠标按钮,通常是左按钮)并传播GtkButton
特定clicked
/ button-release-event
信号。< / p>
<强>更新强>
如果你真的有特殊需求,你可以写一个小部件处理按钮自己(从头开始或从GtkButton
的副本开始)或你子类化并覆盖该特定事件的处理程序(不是确定这是可能的,似乎有很多函数对GtkButton
中的事件做了一些魔术 - 如果可能,那么只需将回调挂钩到信号特定函数指针并使其调用原始回调(但不关心返回值)并始终返回GDK_PROPAGATE_EVENT
)
答案 1 :(得分:0)
X信号事件(通常是具有布尔值返回以指示事件已被完全处理的事件)与其他信号略有不同,特别是在gtkmm中: https://developer.gnome.org/gtkmm-tutorial/stable/sec-xeventsignals.html.en
因此尝试将false作为连接()的额外参数传递。
但是,我不认为改变标准小部件的行为是个好主意。按下按钮时,人们不希望使用键盘修饰符。对于用户来说,复选框或额外按钮会更清晰。