热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GTK+-3.0编程(六)走进GtkApplication,采用面向对象的设计方式设计应用

http:www.cnblogs.comrain-blogpgtk3-6.html在GTK3中增加了一个GtkApplicaton类,便于我们处理多窗口程序,同时有了GtkAp


http://www.cnblogs.com/rain-blog/p/gtk3-6.html

  在 GTK3 中增加了一个 GtkApplicaton 类,便于我们处理多窗口程序,同时有了 GtkApplication 我们也更容易创建灵活,易用,界面美观的应用程序。

在前面的几个例子中,演示了如何利用 GtkApplication 直接创建单个窗口,并知道了在哪里设计我们的 UI 。以及简单尝试了 GtkBuilder 。

接下来,我们走进 GtkApplication 。采用面向对象的设计方式设计我们的应用。

我们想要封装一个 MyApp 和 MyAppWindow , 它继承了 GtkApplcation 和 GtkApplicationWindow。

首先需要创建如下几个文件:

main.c : 主函数在此文件。

myapp.c mypp.h : 封装的 MyApp

myappwindow.c myappwindow.h : 封装的 MyAppWindow

 

  采用这样的设计方式,主函数里面只需要一句话,main.c 内容如下:

#include 

#include "myapp.h"


int main(int argc , char *argv[])
{
//my_app_new() 是我们封装好的,创建一个 MyApp 的接口
return g_application_run ( G_APPLICATION ( my_app_new() ) , argc , argv );
}

  接下来是 myapp.c

#include 

#include "myapp.h"
#include "myappwindow.h" //使用到我们封装的 MyAppWindow 提供的接口

//利用C语言结构,创建 MyApp 类型, 其父类型为 GtkApplication
struct _MyApp
{
GtkApplication parent;
};

//同样定义 MyAppClass 类
struct _MyAppClass
{
GtkApplicationClass parent_class;
};

//利用G_DEFINE_TYPE 宏,注册定义 MyApp 类型 , 对应参数分别代表:类型名 , 小写类型名(用下划线分隔) , 父类型
G_DEFINE_TYPE ( MyApp , my_app , GTK_TYPE_APPLICATION );

//my_app初始化函数原型
static void my_app_init (MyApp *app)
{

}
//my_app activate 信号原型 , 相当于之前几节我们手动链接的 activate 函数
static void my_app_activate (GApplication *app)
{
MyAppWindow *win;

//因此在这里面创建窗口,用我们封装好的 MyAppWindow
win = my_app_window_new ( MY_APP(app) );
//将窗口放在前台 , 自动调用 gtk_widget_show_all()
gtk_window_present (GTK_WINDOW(win));
}
//处理命令行参数的函数原型
static void my_app_open (GApplication *app ,
GFile **files ,
gint n_files ,
const gchar *hint)
{
GList *windows;
MyAppWindow *win;
int i;

windows = gtk_application_get_windows ( GTK_APPLICATION(app) );
if(windows)
win = MY_APP_WINDOW( windows->data );
else
win = my_app_window_new ( MY_APP(app) );

for(i = 0; i my_app_window_open ( win , files[i] );

gtk_window_present ( GTK_WINDOW(win) );
}

//MyApp 类的初始化函数,在这里面即可复写MyApp类继承GtkAppliation类的默认信号处理函数。
static void my_app_class_init ( MyAppClass *class)
{
//将activate信号和open信号处理函数改为我们写的
G_APPLICATION_CLASS (class) ->activate = my_app_activate;
G_APPLICATION_CLASS (class) ->open = my_app_open;
}

//这是向外提供的接口,不用加 static 修饰。
MyApp *my_app_new (void)
{
//按照我们创建的类型创建一个 MyApp
return g_object_new ( MY_APP_TYPE ,
"application-id" ,
"org.gtk.myapp" ,
"flags" ,
G_APPLICATION_HANDLES_OPEN ,
NULL);
}

  myapp.h 内容如下:

#ifndef _My_App_H
#define _My_App_H

#include


//my_app_get_type() 这些函数,我们虽然没写,但是在注册定义 MyApp 类型的时候根据填写的 my_app 会自动生成。
#define MY_APP_TYPE ( my_app_get_type () )
#define MY_APP(obj) ( G_TYPE_CHECK_INSTANCE_CAST( (obj) , MY_APP_TYPE , MyApp) )

typedef struct _MyApp MyApp;
typedef struct _MyAppClass MyAppClass;


//在 myapp.c 中的其他函数属于私有,暂时不需要向外提供。
GType my_app_get_type (void);
MyApp *my_app_new (void);


#endif // _My_App_

  下面封装MyAppWindow类型的方式和上面一样,如下是 myappwindow.c

#include 

#include "myapp.h"
#include "myappwindow.h"

struct _MyAppWindow
{
GtkApplicationWindow parent;
};

struct _MyAppWindowClass
{
GtkApplicationWindowClass parent_class;
};

G_DEFINE_TYPE ( MyAppWindow , my_app_window , GTK_TYPE_APPLICATION_WINDOW);

static void my_app_window_init ( MyAppWindow *app)
{

}

static void my_app_window_class_init ( MyAppWindowClass *class)
{

}

MyAppWindow *my_app_window_new (MyApp *app)
{
return g_object_new ( MY_APP_WINDOW_TYPE ,
"application" ,
app ,
NULL);
}

void my_app_window_open ( MyAppWindow *win , GFile *file)
{

}

  以及 myappwindow.h

#ifndef _My_App_Window_H
#define _My_App_Window_H

#include
#include "myapp.h"

#define MY_APP_WINDOW_TYPE (my_app_window_get_type())
#define MY_APP_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST( (obj) , MY_APP_WINDOW_TYPE , MyAppWindow) )

typedef struct _MyAppWindow MyAppWindow;
typedef struct _MyAppWindowClass MyAppWindowClass;

GType my_app_window_get_type (void);
MyAppWindow *my_app_window_new (MyApp *app);
void my_app_window_open (MyAppWindow *win , GFile *file);

#endif //_My_App_Window_

  编译并运行:

gcc main.c myapp.c myappwindow.c  `pkg-config --cflags --libs gtk+-3.0` -Wall
.
/a.out

  运行结果如下:








推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
上善若水0716812
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有