c – GTK为多个小部件使用一个处理程序

c – GTK为多个小部件使用一个处理程序,第1张

概述我有一个回调函数如下: void handle(GtkWidget *widget, gpointer data) {...} 由于我有很多这个窗口的小部件,我想使用这个回调作为唯一的处理程序,以避免编写一堆小函数.最初我想过使用存储在窗口中的UI类的枚举,然后我会按如下方式测试它: UIClass::Signal signal = (UIClass::Signal) data;switch ( 我有一个回调函数如下:

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为多个小部件使用一个处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存