Gtk按钮在左键单击时不触发按钮释放事件

时间:2014-05-01 12:11:29

标签: button gtk gtk3 gtkmm

我想知道为什么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 );
}

2 个答案:

答案 0 :(得分:0)

按钮实现处理按钮释放事件本身(如果它是主鼠标按钮,通常是左按钮)并传播GtkButton特定clicked / button-release-event信号。< / p>

Source

<强>更新

如果你真的有特殊需求,你可以写一个小部件处理按钮自己(从头开始或从GtkButton的副本开始)或你子类化并覆盖该特定事件的处理程序(不是确定这是可能的,似乎有很多函数对GtkButton中的事件做了一些魔术 - 如果可能,那么只需将回调挂钩到信号特定函数指针并使其调用原始回调(但不关心返回值)并始终返回GDK_PROPAGATE_EVENT

答案 1 :(得分:0)

X信号事件(通常是具有布尔值返回以指示事件已被完全处理的事件)与其他信号略有不同,特别是在gtkmm中: https://developer.gnome.org/gtkmm-tutorial/stable/sec-xeventsignals.html.en

因此尝试将false作为连接()的额外参数传递。

但是,我不认为改变标准小部件的行为是个好主意。按下按钮时,人们不希望使用键盘修饰符。对于用户来说,复选框或额外按钮会更清晰。