GTK:如何在顶部窗口边框上获取按钮释放事件
我有一个程序,需要知道用户在调整窗口大小后何时释放鼠标按钮。我要求获取窗口的按钮释放信号,当鼠标在窗口内单击时,我会得到这些信号,但当我调整窗口大小并释放鼠标按钮时,我不会得到这些信号。下面是一个演示这一点的简短程序。有人能告诉我,我需要做些什么来获得这些活动吗 人们建议“只需使用配置信号即可”,但最后一个配置信号出现在鼠标停止移动时。在此之后,用户可能会长时间按住鼠标按钮 C代码: '''GTK:如何在顶部窗口边框上获取按钮释放事件,gtk,mouseevent,window-resize,Gtk,Mouseevent,Window Resize,我有一个程序,需要知道用户在调整窗口大小后何时释放鼠标按钮。我要求获取窗口的按钮释放信号,当鼠标在窗口内单击时,我会得到这些信号,但当我调整窗口大小并释放鼠标按钮时,我不会得到这些信号。下面是一个演示这一点的简短程序。有人能告诉我,我需要做些什么来获得这些活动吗 人们建议“只需使用配置信号即可”,但最后一个配置信号出现在鼠标停止移动时。在此之后,用户可能会长时间按住鼠标按钮 C代码: ''' #包括 #包括 GtkWidget*窗口; GtkBuilder*builder; int main(i
#包括
#包括
GtkWidget*窗口;
GtkBuilder*builder;
int
main(int argc,char*argv[]){
gtk_init(0,NULL);//init gtk
builder=gtk_builder_new_来自_文件(“test.glade”);
window=GTK_小部件(GTK_builder_get_对象(builder,window));
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
gtk_builder_connect_信号(builder,NULL);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
gboolean
打开窗口按钮释放事件(GtkWidget*w、GdkEvent*e、gpointer p)
{
printf(“按钮释放”);
返回FALSE;
}
'''
假的
真的
假的
100
80
真的
假的
标签
113
93
''由于单击窗口的边界,且顶部栏位于窗口外部,因此当您单击时,您将收到一个
调出事件
信号。更重要的是,当您释放鼠标按钮时,当窗口再次激活时,它会在事件中发送一个焦点。因此,您可以尝试使用gboolean on_focus_in(GtkWidget*w,GdkEventFocus*ef,gpointer p)
和g_signal\u connect
到focus in event
检测来自窗口外点击的鼠标点击释放。问题似乎忽略了信号中的其他焦点,如打开窗口、不在边界上的按压,这可能是通过gdk\u设备获取位置来实现的(回答可能会让您走上正确的道路),等等
但这里有一个大概的想法,可能值得尝试破解:
#include <stdlib.h>
#include <gtk/gtk.h>
GtkWidget *window;
gboolean on_focus_in (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
printf("release\n");
return TRUE;
}
gboolean on_focus_out (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
printf("press\n");
return TRUE;
}
int
main(int argc, char *argv[]) {
gtk_init(0, NULL); // init Gtk
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect (window,
"focus-in-event",
G_CALLBACK (on_focus_in),
NULL);
g_signal_connect (window,
"focus-out-event",
G_CALLBACK (on_focus_out),
NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}
#包括
#包括
GtkWidget*窗口;
gboolean on_focus_in(GtkWidget*w、GdkEventFocus*ef、gpointer p){
printf(“发布”);
返回TRUE;
}
gboolean on_focus_out(GtkWidget*w、GdkEventFocus*ef、gpointer p){
printf(“press\n”);
返回TRUE;
}
int
main(int argc,char*argv[]){
gtk_init(0,NULL);//init gtk
窗口=gtk_窗口_新建(gtk_窗口_顶层);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
g_信号_连接(车窗,
“关注事件”,
G_回调(在焦点处),
无效);
g_信号_连接(车窗,
“聚焦事件”,
G_回调(在焦点处),
无效);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
我没有看到你说我应该看到的信号。我在代码中添加了一个焦点输出信号并进行了测试:在窗口处于焦点的情况下,我单击边界,拖动它,然后释放它。根本没有信号。在窗口未聚焦的情况下,我单击边界(聚焦),拖动它,释放它(无信号)。简言之,我从来没有得到任何释放鼠标按钮的信号。我遗漏了什么吗?@tgphelps上面的代码示例根本没有打印“release”?焦点输出也没有输出?让我想想……你的gtk版本是什么?当我点击边界时,窗口没有聚焦,它打印了“发布”。在窗口处于焦点的情况下单击边界并没有像您所想的那样给出“焦点输出”。@tgphelps Hmmm不寻常。。。我已经更新了代码和gif,这是您的系统生成的吗/这是您期望发生的吗?我运行了您的代码,没有任何更改。发生这种情况:(1)启动(“释放”),(2)移动窗口(无),(3)调整窗口大小(无),(4)单击窗口外部(“按下”),(5)单击并按住窗口边界(“释放”),(6)拖动窗口边缘并释放(无)。显然,你看到的结果非常不同。我被难住了。我从来没有看到按钮释放的信号,只有当(a)在、和(b)在窗口边框上单击,焦点在,和(b)在窗口边框上单击,或在焦点在外时单击,我才看到按钮按下的信号。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.4 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<signal name="button-release-event" handler="on_window_button_release_event" swapped="no"/>
<child>
<object class="GtkFixed" id="fixed1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Label</property>
</object>
<packing>
<property name="x">113</property>
<property name="y">93</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<placeholder/>
</child>
</object>
</interface>
#include <stdlib.h>
#include <gtk/gtk.h>
GtkWidget *window;
gboolean on_focus_in (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
printf("release\n");
return TRUE;
}
gboolean on_focus_out (GtkWidget* w, GdkEventFocus* ef, gpointer p) {
printf("press\n");
return TRUE;
}
int
main(int argc, char *argv[]) {
gtk_init(0, NULL); // init Gtk
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect (window,
"focus-in-event",
G_CALLBACK (on_focus_in),
NULL);
g_signal_connect (window,
"focus-out-event",
G_CALLBACK (on_focus_out),
NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}