GTK+重拾--08 GTK+中的对话框

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50351564 (一):写在前面在这一个小节中,我们主要学习的是GTK+中的对话框。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50351564

(一):写在前面


在这一个小节中,我们主要学习的是GTK+中的对话框。对话框窗口是众多GUI应用程序中不可或缺的部分。对话框是经常在窗口应用中使用的。对话框可以用来输入数据,修改数据,或者是改变应用程序的使用设置信息等等。下面我们就通过分类来讲解如何使用各种类型的对话框。

(二):消息对话框


消息对话框可以方便在我们的应用程序中,跳出来显示一些有用的信息,其中也可以包含文字或者图像。

下面我们来看一个例子:

#include <gtk/gtk.h>

/**
 * 信息对话框
 */

void show_info(GtkWidget *widget,gpointer window)
{
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,
                                    GTK_BUTTONS_OK,"Download Completed","title");

    gtk_window_set_title(GTK_WINDOW(dialog),"Information");

    gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_widget_destroy(dialog);
}

/**
 * 错误对话框
 */
void show_error(GtkWidget *widget,gpointer window)
{
    GtkWidget *dialog;

    dialog = gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,"Error loading file");
    gtk_window_set_title(GTK_WINDOW(dialog),"Error");
    gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_widget_destroy(dialog);
}

/**
 * 错误对话框
 */
void show_question(GtkWidget *widget,gpointer window)
{
    GtkWidget *dialog;

    dialog = gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_QUESTION,GTK_BUTTONS_YES_NO,"Are you sure to quit?");
    gtk_window_set_title(GTK_WINDOW(dialog),"Question");
    gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_widget_destroy(dialog);
}

/**
 * 警告对话框
 */
void show_warning(GtkWidget *widget,gpointer window)
{

    GtkWidget *dialog;

    dialog = gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_WARNING,GTK_BUTTONS_OK,"Unallowed operation");
    gtk_window_set_title(GTK_WINDOW(dialog),"Warning");
    gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_widget_destroy(dialog);
}

int main(int argc,char *argv[])
{

    GtkWidget *window;
    GtkWidget *table;

    GtkWidget *info;
    GtkWidget *warn;
    GtkWidget *que;
    GtkWidget *err;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),220,150);
    gtk_window_set_title(GTK_WINDOW(window),"Message dialogs");

    table = gtk_table_new(2,2,TRUE);
    gtk_table_set_row_spacings(GTK_TABLE(table),2);
    gtk_table_set_col_spacings(GTK_TABLE(table),2);

    info = gtk_button_new_with_label("Info");
    warn = gtk_button_new_with_label("Warning");
    que = gtk_button_new_with_label("Question");
    err = gtk_button_new_with_label("Error");

    gtk_table_attach(GTK_TABLE(table),info,0,1,0,1,GTK_FILL,GTK_FILL,3,3);
    gtk_table_attach(GTK_TABLE(table),warn,1,2,0,1,GTK_FILL,GTK_FILL,3,3);
    gtk_table_attach(GTK_TABLE(table),que,0,1,1,2,GTK_FILL,GTK_FILL,3,3);
    gtk_table_attach(GTK_TABLE(table),err,1,2,1,2,GTK_FILL,GTK_FILL,3,3);

    gtk_container_add(GTK_CONTAINER(window),table);
    gtk_container_set_border_width(GTK_CONTAINER(window),15);

    g_signal_connect(G_OBJECT(info),"clicked",G_CALLBACK(show_info),(gpointer)window);
    g_signal_connect(G_OBJECT(warn),"clicked",G_CALLBACK(show_warning),(gpointer)window);
    g_signal_connect(G_OBJECT(que),"clicked",G_CALLBACK(show_question),(gpointer)window);
    g_signal_connect(G_OBJECT(err),"clicked",G_CALLBACK(show_error),(gpointer)window);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

这里的几个对话框都是我们在编写程序的常用的,包括问题对话框,警告对话框,消息对话框,错误对话框;我们来看一下我们这个程序的运行效果:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

在上面的例子中,我们展示了四种消息对话框。Information,Warning,Question和Error消息对话框。

gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,"Download Completed","title");

在函数show_question()中,我们构件了一个对话框。而gtk_message_dialog_new()函数正是创建消息对话框的方法。在函数中的参数设置是在说明我们显示那种样式的对话框。系统常量GTK_MESSAGE_INFO是在说明我们想要生成info对话框。系统常量GTK_BUTTONS_OK将生成一个”ok”按钮,最后一个参数是我们想要在对话框中显示的文字。

gtk_window_set_title(GTK_WINDOW(dialog),"Warning");
gtk_dialog_run(GTK_DIALOG(dialog));

gtk_widget_destroy(dialog);

在这里,主要是对生成的对话框进行设置,先设置标题,接着运行这个对话框,最后设置该对话框必须手动关闭。

(三):GTK应用程序信息对话框


GTK应用程序对话框是用来显示应用程序中的有关提示信息的。GTK应用程序对话框可以显示应用程序的logo,名称,版本,版权,网站或者认证之类的信息,中间当然也可以添加一些别的信息。

下面我们举个例子:

#include <gtk/gtk.h>

void show_about(GtkWidget *widget,gpointer data)
{
    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file("battery.jpg",NULL);

    GtkWidget *dialog = gtk_about_dialog_new();
    gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog),"Battery");
    gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog),"0.9");
    gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),"(c)BoBo");
    gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),"Battery is a simple tool for battery checking!!");
    gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog),"http://www.baidu.com");
    gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog),pixbuf);

    g_object_unref(pixbuf),pixbuf = NULL;
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

int main(int argc,char *argv[])
{
    GtkWidget *window;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),220,150);
    gtk_window_set_title(GTK_WINDOW(window),"Battery");

    gtk_container_set_border_width(GTK_CONTAINER(window),15);
    gtk_widget_add_events(window,GDK_BUTTON_PRESS_MASK);

    g_signal_connect(G_OBJECT(window),"button-press-event",G_CALLBACK(show_about),(gpointer)window);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

上面的代码中我们用了构件GtkAboutDialog以及该构件的一些特性。当我们单击应用程序窗口的时候,该GTK应用程序信息对话框就会跳出来。

我们先来看一下运行效果:

这里写图片描述

这里写图片描述

我们使用gtk_about_dialog_new()函数来生成一个新的GtkAboutDialog构件,接着我们再通过一些方法函数来为对话框进行设置,这些设置函数还是看上去比较简单的,使用起来也非常方便。

(四):GTK字体选择对话框


GTK字体选择对话框是用来选择字体的,这个对话框也是我们常用的。该对话框在一些应用程序中很有代表性,尤其是一些文字处理或者文字排版软件。

#include <gtk/gtk.h>


void select_font(GtkWidget *widget,gpointer label)
{
    GtkResponseType result;
    GtkWidget *dialog = gtk_font_selection_dialog_new("Select Font");
    result = gtk_dialog_run(GTK_DIALOG(dialog));

    if(result == GTK_RESPONSE_OK || result == GTK_RESPONSE_APPLY)
    {
        PangoFontDescription *font_desc;

        gchar *fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog));
        font_desc = pango_font_description_from_string(fontname);

        gtk_widget_modify_font(GTK_WIDGET(label),font_desc);

        g_free(fontname);
    }

    gtk_widget_destroy(dialog);

}

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *label;
    GtkWidget *vbox;

    GtkWidget *toolbar;
    GtkToolItem *font;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),280,200);
    gtk_window_set_title(GTK_WINDOW(window),"Font Selection Dialog");

    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);

    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_ICONS);

    gtk_container_set_border_width(GTK_CONTAINER(toolbar),2);

    font = gtk_tool_button_new_from_stock(GTK_STOCK_SELECT_FONT);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar),font,-1);

    gtk_box_pack_start(GTK_BOX(vbox),toolbar,FALSE,FALSE,5);

    label = gtk_label_new("ZetCode");
    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);
    gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,FALSE,5);

    g_signal_connect(G_OBJECT(font),"clicked",G_CALLBACK(select_font),label);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

在上面的代码中,我们在窗口中庸放置了一个简单标签,如果我们点击工具栏按钮,那么字体选择对话框就会跳出来。

我们先来看一下程序的运行效果:

这里写图片描述

这里写图片描述

GtkWidget *dialog = gtk_font_selection_dialog_new("Select Font");
result = gtk_dialog_run(GTK_DIALOG(dialog));

通过上面的方法我们生成了一个字体选择对话框,即GtkFontSelectionDialog。

    if(result == GTK_RESPONSE_OK || result == GTK_RESPONSE_APPLY)
    {
        PangoFontDescription *font_desc;

        gchar *fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog));
        font_desc = pango_font_description_from_string(fontname);

        gtk_widget_modify_font(GTK_WIDGET(label),font_desc);

        g_free(fontname);
    }

如果我们点击”OK”按钮,我们就得到了字体的相关信息,并且把该设置信息作用于前面生成的标签。

(五):GTK色彩选择对话框


顾名思义,GTK色彩选择对话框就是一个用于选择颜色的对话框。

#include <gtk/gtk.h>

void select_font(GtkWidget *widget,gpointer label)
{
    GtkResponseType result;
    GtkColorSelection *colorsel;

    GtkWidget *dialog = gtk_color_selection_dialog_new("Font Color");
    result = gtk_dialog_run(dialog);

    if(result == GTK_RESPONSE_OK){
        GdkColor color;
        colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel);

        gtk_color_selection_get_current_color(colorsel,&color);
        gtk_widget_modify_fg(GTK_WIDGET(label),GTK_STATE_NORMAL,&color);
    }

    gtk_widget_destroy(dialog);

}

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *widget;
    GtkWidget *label;
    GtkWidget *vbox;

    GtkWidget *toolbar;
    GtkToolItem *font;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),280,200);
    gtk_window_set_title(GTK_WINDOW(window),"Color Selection Dialog");

    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);

    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_ICONS);
    gtk_container_set_border_width(GTK_CONTAINER(toolbar),2);

    font = gtk_tool_button_new_from_stock(GTK_STOCK_SELECT_COLOR);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar),font,-1);

    gtk_box_pack_start(GTK_BOX(vbox),toolbar,FALSE,FALSE,5);

    label = gtk_label_new("ZetCode");
    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);
    gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,FALSE,5);

    g_signal_connect(G_OBJECT(font),"clicked",G_CALLBACK(select_font),label);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

该例子程序的颜色选择器和上面的字体选择器是非常相似的。在这里我们是改变标签文字的颜色。

GtkWidget *dialog = gtk_color_selection_dialog_new("Font Color");
result = gtk_dialog_run(dialog);

通过该方法创建一个GtkColorSelectionDialog构件。

    if(result == GTK_RESPONSE_OK){
        GdkColor color;
        colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel);

        gtk_color_selection_get_current_color(colorsel,&color);
        gtk_widget_modify_fg(GTK_WIDGET(label),GTK_STATE_NORMAL,&color);
    }

当我们点击ok之后,我们就得到了相关的颜色设置信息,并我们把这个设置用于改变标签文字的颜色。

我们来看一下运行效果:

这里写图片描述

(六):写在后面


好了,到了这里,关于对话框的学习就到这里了,后面我们会继续GTK+的学习,后面一节主要是学习GTK+中的构件。

源码下载

目录
相关文章
|
人工智能 语音技术 云计算
基于客户真实使用场景的云剪辑Timeline问题解答与代码实操
本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第6期,从客户真实实践场景出发,分享一些Timeline小技巧(AI_TTS、主轨道、素材对齐),助力客户降低开发时间与成本。
136209 86
基于客户真实使用场景的云剪辑Timeline问题解答与代码实操
|
机器学习/深度学习 人工智能 监控
人工智能之人脸识别技术应用场景
人脸识别技术是一种通过计算机技术和模式识别算法来识别和验证人脸的技术。它可以用于识别人脸的身份、检测人脸的表情、年龄、性别等特征,以及进行人脸比对和活体检测等应用。
1166 1
|
存储 开发框架 安全
如何平滑将注册中心从Eureka迁移到Nacos?
Nacos与Eureka相比,Nacos的优点非常明显,当然首选Nacos作为注册中心。本文主要介绍如何从Eureka无缝平滑迁移到Nacos注册中心,业务方应用改动最小,业务应用改造一次完成迁移。
1874 0
如何平滑将注册中心从Eureka迁移到Nacos?
|
7月前
|
人工智能 弹性计算 搜索推荐
阿里云建站方案与产品怎么选?云服务器、万小智AI建站、定制官网各自优势与选择参考
阿里云提供云服务器、万小智AI建站、云·企业官网等多种建站方案。云服务器适合技术实力强的企业,提供高度灵活性和可定制性;万小智AI建站适合中小企业和个人用户,成本低且操作简单;云·企业官网提供专业定制服务,适合对网站有高要求的企业。阿里云还提供多款建站套餐,如39元AI建站套餐等,用户可根据需求和预算选择合适的方案,提升品牌形象和客户体验。
|
8月前
|
弹性计算 人工智能 运维
建站选择阿里云虚拟主机、轻量应用服务器、云服务器、万小智AI建站、云·企业官网哪个更好?
在选择阿里云建站产品时,面对云虚拟主机、轻量应用服务器、云服务器ECS、万小智AI建站和云·企业官网等多种选择,用户往往会感到困惑。每种产品都有其独特的优势和适用场景,如何根据自己的需求和技术背景选择最适合的建站产品,成为了用户关注的焦点。本文为大家比较阿里云这五种适合建站的云产品各自的优势和劣势,以及它们的适用人群,以供大家对比参考。
|
4月前
|
人工智能 弹性计算 安全
阿里云秒杀活动全攻略:时间、入口、抢购技巧与低成本上云方案
2026年阿里云已全面升级限时秒杀活动,主打轻量应用服务器与ECS云服务器,面向新用户提供38元/年、9.9元/月等超低价机型,每日固定两场开抢,无需复杂门槛,适合搭建网站、小程序、AI代理、测试环境等多种场景。本次活动性价比极高,尤其适合用来部署OpenClaw这类7×24小时运行的AI助手。
480 11
|
5月前
|
人工智能 自然语言处理 大数据
2026年1688开店真能赚到钱吗?最新投入产出全解析,AI红利期已至!
2026年1688全面AI化,开店年费9988元起(诚信通AI版),升级选项达3.68万–10.68万元/年;另需数字推广(约3万/年)及人力投入。平台推出“三保”服务(保5万访客、500询盘、300订单),未达标返6688元红包。AI正驱动决策、组织与竞争力三大位移,助力源头工厂智能升级。
|
5月前
|
缓存 NoSQL 关系型数据库
开源扫码点餐系统源码部署实战:服务器与数据库优化方案
本文直击扫码点餐系统落地难点:源码易得,稳定部署难!详解Nginx负载均衡、MySQL索引与读写分离、Redis缓存与分布式锁、雪花算法订单号等十大实战优化方案,助你从架构到代码一步到位,扛住高峰并发。(239字)
|
6月前
|
运维 安全 应用服务中间件
Xshell高效运维实战:从基础操作到自动化进阶
本文详解Xshell在运维中的高效实战:涵盖会话标准化管理、批量命令执行、VBScript/Python自动化脚本、SSH密钥安全加固及隧道穿透等核心技巧,助你将重复操作耗时缩短90%以上,快速构建安全、智能、可审计的自动化运维体系。(239字)
567 1
|
8月前
|
JSON 安全 Java
支付宝支付实战全攻略
本文详细介绍了基于JDK17的企业级支付宝支付实现方案。首先阐述了支付宝支付的核心参与者、安全机制和支付场景区分,重点分析了RSA2签名验证流程。随后提供了完整的开发指南,包括开放平台配置、Maven环境搭建、数据库设计以及核心工具类封装。文章详细展示了基于MyBatis-Plus的持久层实现和Swagger3接口文档集成,并重点讲解了支付回调处理、退款功能等核心业务逻辑的实现。针对企业级应用场景,特别强调了幂等性设计、高可用方案和常见问题的解决方案,包括异步通知丢失兜底机制和安全加固措施。
770 2