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

Button Gtk按钮未在左键单击时触发按钮释放事件,button,gtk,gtk3,gtkmm,Button,Gtk,Gtk3,Gtkmm,我想知道为什么GTK按钮的按钮释放事件不是由鼠标左键点击触发的。在以下代码(使用gtkmm3)中,按钮在左键单击时触发clicked事件,在使用任何其他鼠标按钮单击时触发button release事件。我想确定单击按钮时是否按下了任何修改键,因此我需要按钮释放事件提供的附加信息。有没有办法让它在左键点击时触发呢 #include <iostream> #include <gtkmm.h> void clicked() { std::cout <<

我想知道为什么GTK按钮的按钮释放事件不是由鼠标左键点击触发的。在以下代码(使用gtkmm3)中,按钮在左键单击时触发clicked事件,在使用任何其他鼠标按钮单击时触发button release事件。我想确定单击按钮时是否按下了任何修改键,因此我需要按钮释放事件提供的附加信息。有没有办法让它在左键点击时触发呢

#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 );
}
#包括
#包括
无效单击()
{
标准::无法运行(窗口);
}

按钮实现本身处理按钮释放事件(如果它是主要的鼠标按钮,通常是左键),并传播特定的
单击的
/
按钮释放事件
信号

更新:

如果您确实有特殊需要,您可以自己编写一个小部件处理按钮(从头开始或从
GtkButton
的副本开始),或者为该特定事件创建子类并覆盖处理程序(不确定这是否可行,在
GtkButton
中似乎有相当多的函数对事件起到了神奇的作用-如果可能的话,只需将回调函数挂接到特定于信号的函数指针上,并使其调用原始回调函数(但不关心返回值)并且始终返回
GDK_PROPAGATE_EVENT

X信号事件(通常,具有布尔返回以指示事件已完全处理的事件)与其他信号略有不同,尤其是在gtkmm中:

因此,请尝试将false作为额外参数传递给connect()


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

很遗憾,答案的后半部分缺失,但我仍然会接受,因为消息来源肯定回答了问题uestion。我必须说,我不认为禁止常规按钮释放事件有什么意义,即使有特定于按钮的事件,所以我必须看看是否可以覆盖该函数。是的,但您需要子类化
GtkButton
(C类,如果使用C++,则不确定这是否有效)并覆盖
GtkWidget
事件的函数指针,确保返回
FALSE
(或者由于一些版本
GDK\u事件传播
).我不知道为什么一半的答案被吃掉了…我会尽快修复它-目前还不知道我想要/确实添加了什么。谢谢你提供的有用信息。我似乎跳过了文档的这一部分。我会尝试传递额外的参数,当我有时间继续该项目时。我同意使用带按钮的键盘修改器是一个糟糕的idea,但它只是一个原型应用程序,我想避免小部件对很少使用的功能造成混乱。正如你所说的,一个额外的按钮会更合适。