voID handle(GtkWidget *Widget,gpointer data) {...}
由于我有很多这个窗口的小部件,我想使用这个回调作为唯一的处理程序,以避免编写一堆小函数.最初我想过使用存储在窗口中的UI类的枚举,然后我会按如下方式测试它:
UIClass::Signal signal = (UIClass::Signal) data;switch (signal) { case UIClass::main_button: // handle case UIClass::check_Box: ...}
但编译器拒绝该代码段第一行中的强制转换.
有没有一种标准的方法来实现这一目标?或者GTK是否设计为每个小部件都有一个处理程序?
解决方法 在类中存储指向窗口小部件的指针,并将整个对象传递给处理程序:#include <gtk/gtk.h>#include <iostream>struct UIClass{ GtkWidget* Widget1,*Widget2,*Box; UIClass() { Widget1 = gtk_button_new_with_label("button1"); Widget2 = gtk_button_new_with_label("button2"); Box = gtk_hBox_new(true,10); gtk_Box_pack_start(GTK_Box(Box),Widget1,1); gtk_Box_pack_start(GTK_Box(Box),Widget2,1); } static voID handle(GtkWidget* sender,UIClass* uiClass) { if(sender == uiClass->Widget1) std::cout<<"Widget1"<<std::endl; else if(sender == uiClass->Widget2) std::cout<<"Widget2"<<std::endl; else std::cout<<"something else"<<std::endl; } voID connect() { g_signal_connect(Widget1,"clicked",G_CALLBACK(UIClass::handle),this); g_signal_connect(Widget2,this); }};int main(int argc,char *argv[]){ gtk_init (&argc,&argv); GtkWidget* window = gtk_window_new(GTK_WINDOW_topLEVEL); UIClass ui; ui.connect(); gtk_container_add(GTK_CONTAINER(window),ui.Box); gtk_Widget_show_all(window); gtk_main(); return 0;}总结
以上是内存溢出为你收集整理的c – GTK为多个小部件使用一个处理程序全部内容,希望文章能够帮你解决c – GTK为多个小部件使用一个处理程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)