C++ 打开小部件';s根据鼠标进入/离开事件打开和关闭焦点

C++ 打开小部件';s根据鼠标进入/离开事件打开和关闭焦点,c++,gtk3,gtkmm3,C++,Gtk3,Gtkmm3,我想在鼠标指针进入这个小部件时打开Gtk::SpinButtonentry focus,然后在指针离开时再次关闭它 当窗口仍在运行时,信号事件似乎没有响应。但是std::cout输出是在我关闭窗口后打印的 如何实现预期的小部件行为 #包括 #包括 类SpinButton示例:public Gtk::Window{ Gtk::网格; Gtk::标签; Glib::RefPtr调整; Gtk::旋转按钮旋转按钮; 公众: SpinButtonExample(); bool on_enter_noti

我想在鼠标指针进入这个小部件时打开
Gtk::SpinButton
entry focus,然后在指针离开时再次关闭它

当窗口仍在运行时,信号事件似乎没有响应。但是
std::cout
输出是在我关闭窗口后打印的

如何实现预期的小部件行为

#包括
#包括
类SpinButton示例:public Gtk::Window{
Gtk::网格;
Gtk::标签;
Glib::RefPtr调整;
Gtk::旋转按钮旋转按钮;
公众:
SpinButtonExample();
bool on_enter_notify_事件(GdkEventCrossing*);
请假通知事件(GdkEventCrossing*);
};
SpinButtonExample::SpinButtonExample()
:标签(“Hi”)
,调整(Gtk::调整::创建(0,0,10))
,旋转按钮(调整)
{
添加事件(Gdk::输入通知掩码);
添加事件(Gdk::离开通知掩码);
旋转按钮。信号\输入\通知\事件()。连接(
sigc::mem_fun(*这个,&按钮示例::在输入通知事件时);
旋转按钮。信号\离开\通知\事件()。连接(
sigc::mem_fun(*此和旋转按钮示例::休假通知事件));
网格。设置方向(Gtk::方向为水平);
grid.set_列_齐次(true);
网格。设置边界和开始(10);
网格。设置边界和结束(10);
网格。设置“边距”和“顶部”(10);
网格。设置边缘和底部(10);
添加(标签);
添加网格(旋转按钮);
添加(网格);
显示全部();
}
布尔
SpinButton示例::在输入通知事件(GdkEventCrossing*事件)时
{
如果(事件->类型==GDK\U滚动){
std::cout type==GDK_LEAVE_NOTIFY){
标准::不能运行(测试);
}

非常感谢上面的下划线注释

答案是当鼠标指针离开
Gtk::SpinButton
widget时,将我们的焦点指向另一个widget,对于enter事件,将焦点抓回

仅使用
set\u can\u focus()
打开和关闭将不起作用

以下是正确的解决方案:

#包括
#包括
类SpinButton示例:public Gtk::Window{
Gtk::网格;
Gtk::标签;
Glib::RefPtr调整;
Gtk::旋转按钮旋转按钮;
Gtk::按钮;
公众:
SpinButtonExample();
bool on_enter_notify_事件(GdkEventCrossing*);
请假通知事件(GdkEventCrossing*);
};
SpinButtonExample::SpinButtonExample()
:标签(“Hi”)
,调整(Gtk::调整::创建(0,0,10))
,旋转按钮(调整)
,按钮(“默认值”)
{
添加事件(Gdk::输入通知掩码);
添加事件(Gdk::离开通知掩码);
按钮。设置边距和开始(10);
按钮。设置_can_default();
按钮。抓住焦点();
spinbutton.set\u can\u default(假);
旋转按钮。信号\输入\通知\事件()。连接(
sigc::mem_fun(*这个,&按钮示例::在输入通知事件时);
旋转按钮。信号\离开\通知\事件()。连接(
sigc::mem_fun(*此和旋转按钮示例::休假通知事件));
网格。设置方向(Gtk::方向为水平);
grid.set_列_齐次(true);
网格。设置边界和开始(10);
网格。设置边界和结束(10);
网格。设置“边距”和“顶部”(10);
网格。设置边缘和底部(10);
添加(标签);
添加网格(旋转按钮);
添加(按钮);
添加(网格);
显示全部();
}
布尔
SpinButton示例::在输入通知事件(GdkEventCrossing*事件)时
{
如果(事件->类型==GDK\u输入\u通知){

std::cout如果你把
std::endl
放在你的
cout
s中会怎么样?也就是说,只是
cout
没有刷新,让你认为事件被延迟到进程结束。如果你想在进入时打开焦点,为什么要检查
如果(事件->类型==GDK\u滚动)
?指针输入和滚动显然是不同的事情。但你也不需要费心检查,因为获取信号意味着事件具有该类型,否则为什么要为特定类型的事件命名这些信号…?谢谢@underline_d
std::endl
。但是离开通知并没有关闭我的小部件CUS你的意思是什么?它不会关闭焦点吗?和/或它会使小部件保持焦点吗?请先尝试将焦点返回到其他“默认”小部件,然后。