热键与快捷键

热键及快捷键(GtkAccelGroup)


热键:一般是字母带下划线.在当前控件内(如打开的菜单)可以用alt+字母来代替点击的功能
快捷键:一般指,在本窗口任何位置内,按某组合键,都可以代替点击的功能.
:) 如果你的理解与我的有冲突,请以我的理解为准!
试举例证:
#include 
#include

const char *txtShow = "http://tresss.com";

GtkWidget *frmMain, *tblTop, *txtTest, *lblShow,*btnSet,*btnGet;
GtkAccelGroup *agMain;

void destroy (GtkWidget *widget, gpointer *data)
{
gtk_main_quit ();
}
//set Caption
void txt_setCaption (GtkWidget *widget, gpointer *data)
{
gtk_entry_set_text(GTK_ENTRY(txtTest), txtShow);
}
//get Caption
void txt_getCaption (GtkWidget *widget, gpointer *data)
{
gtk_label_set_text(GTK_LABEL(lblShow), gtk_entry_get_text(GTK_ENTRY(txtTest)));
}

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

gtk_init (&argc, &argv);

frmMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_signal_connect (GTK_OBJECT (frmMain), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_border_width (GTK_CONTAINER (frmMain), 10);
gtk_widget_add_events(frmMain, GDK_BUTTON_PRESS_MASK);

tblTop = gtk_table_new(5,2,TRUE);
gtk_container_add(GTK_CONTAINER(frmMain),tblTop);

//controls create
txtTest = gtk_entry_new();
gtk_table_attach_defaults(GTK_TABLE(tblTop),txtTest,0,2,0,1);
lblShow = gtk_label_new("Entry Info");
gtk_table_attach_defaults(GTK_TABLE(tblTop),lblShow,0,2,1,2);
btnSet = gtk_button_new_with_mnemonic("Set _Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnSet,0,1,2,3);
btnGet = gtk_button_new_with_mnemonic("_Get Caption");
gtk_table_attach_defaults(GTK_TABLE(tblTop),btnGet,1,2,2,3);


//signal
gtk_signal_connect(GTK_OBJECT(btnSet), "clicked", GTK_SIGNAL_FUNC(txt_setCaption), NULL);
gtk_signal_connect(GTK_OBJECT(btnGet), "clicked", GTK_SIGNAL_FUNC(txt_getCaption), NULL);
//bind Accelerate
agMain = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);

//Show everything;
gtk_widget_show (frmMain);
gtk_widget_show (tblTop);
gtk_widget_show (txtTest);
gtk_widget_show (lblShow);
gtk_widget_show (btnSet);
gtk_widget_show (btnGet);

gtk_main ();

return 0;
}


热键
可以看出.热键的使用很简单.
仅仅是用gtk_button_new_with_mnemonic代替了原来的创建函数gtk_button_new_with_label.
而且在想设为热键的字母前加一个下划线"_",这与其它语言也是有很大差异的.其它所有我了解的语言中,都是用"&"+字母来设定热键的,而这里是"_"+字母.
当然,你有可能会在字符中使用"_"这个字符本身.这时,你可以用"__"连续的两个下划线来实现.在显示时,就会显示出字符"_".
编译后可以按"alt"+c,就会执行btnSet所连接的txt_setCaption()函数.

快捷键
GTK中的快捷键是通过GtkAccelGroup控件来实现的.
gtk_accel_group_new();创建函数没有任何参数.
gtk_window_add_accel_group(GTK_WINDOW(frmMain), agMain);这里是将GtkAccelGroup添加到窗体frmMain中.即表示只要是在窗体frmMain中按键,都会判断触发agMain设定的快捷键.
gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_g,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
这里是真正的注册一个快捷键.第一个参数表示快捷键触发后要执行的对象.
第二个参数表示按键后,要触发这个对象的某个信号,这里是点击.
第三个参数表示是哪一个键.它定义在gdk/gdkkeysyms.h文件中,需要手动包含此文件.
第四个表示控件键.这里是ctrl键.
第五个参数是快捷键标志.官方文档没有太多说明.这个参数表示的是会在GtkAccelLabel控件中显示按键名.

第一和第二个参数其实就是表示,当按键被按下后要触发哪个控件的哪个信号.
第三和第四个参数就是表示注册的是哪个快捷键.
普通键在gdk/gdkkeysyms.h中有定义,你可以自已查找.
而控制键是一个掩码结构.说明如下:
enum GdkModifierType

typedef enum
{
GDK_SHIFT_MASK = 1 << 0,
GDK_LOCK_MASK = 1 << 1,
GDK_CONTROL_MASK = 1 << 2,
GDK_MOD1_MASK = 1 << 3,
GDK_MOD2_MASK = 1 << 4,
GDK_MOD3_MASK = 1 << 5,
GDK_MOD4_MASK = 1 << 6,
GDK_MOD5_MASK = 1 << 7,
GDK_BUTTON1_MASK = 1 << 8,
GDK_BUTTON2_MASK = 1 << 9,
GDK_BUTTON3_MASK = 1 << 10,
GDK_BUTTON4_MASK = 1 << 11,
GDK_BUTTON5_MASK = 1 << 12,

/* The next few modifiers are used by XKB, so we skip to the end.
* Bits 15 - 25 are currently unused. Bit 29 is used internally.
*/

GDK_SUPER_MASK = 1 << 26,
GDK_HYPER_MASK = 1 << 27,
GDK_META_MASK = 1 << 28,

GDK_RELEASE_MASK = 1 << 30,

GDK_MODIFIER_MASK = 0x5c001fff
} GdkModifierType;

说明:
GDK_SHIFT_MASK
the Shift key.
GDK_LOCK_MASK
a Lock key (depending on the modifier mapping of the X server
this may either be CapsLock or ShiftLock).
GDK_CONTROL_MASK
the Control key.
GDK_MOD1_MASK
the fourth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier, but normally it is the Alt key).
GDK_MOD2_MASK
the fifth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD3_MASK
the sixth modifier key (it depends on the modifier mapping of the X server which key is
interpreted as this modifier).
GDK_MOD4_MASK
the seventh modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_MOD5_MASK
the eighth modifier key (it depends on the modifier mapping of the X server which key
is interpreted as this modifier).
GDK_BUTTON1_MASK
the first mouse button.
GDK_BUTTON2_MASK
the second mouse button.
GDK_BUTTON3_MASK
the third mouse button.
GDK_BUTTON4_MASK
the fourth mouse button.
GDK_BUTTON5_MASK
the fifth mouse button.
GDK_SUPER_MASK
the Super modifier. Since 2.10
GDK_HYPER_MASK
the Hyper modifier. Since 2.10
GDK_META_MASK
the Meta modifier. Since 2.10
GDK_RELEASE_MASK
not used in GDK itself. GTK+ uses it to differentiate between (keyval, modifiers) pairs from
key press and release events.
GDK_MODIFIER_MASK
a mask covering all modifier types.

可以看到,连鼠标按键都包含其中,但"win"键是不在其中的.
说明:这里的GDK_MOD1_MASK就是表示"alt"键的.

但现在有一个问题.就是,如果我想设快捷键为"F1"呢?即没有控制键.
很抱歉,GTK本身不提供这个功能.因为它们缺少一个成员来表示空值(已提交到官方bug网站,建议其添加一个成员).
所以只能如此做gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)0, GTK_ACCEL_VISIBLE);
用0来表示不需要控制键,只要按F1就会触发事件.
同样,如果要设定"ctrl + alt + F1"这样的组合键,就如此gtk_widget_add_accelerator(btnGet, "clicked", agMain,GDK_F1,(GdkModifierType)(GDK_SHIFT_MASK | GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);
第五个参数表示的是在GtkAccelLabel控件中显示按键名.即在右侧显示"ctrl+F1"字样.
但这里我们测试的是按钮.按钮上没有GtkAccelLabel.如果是菜单的话,由于GtkMenuItem默认会使用GtkAccelLabel控件来显示字符,所以菜单上会提示此字样.
如果你要在变通按钮上使用快捷键,就只能手动添加上去了.

总体来说GTK的快捷键设置比较麻烦.但相对Windows开发,比较独立.
2008.12.03

转载于:https://www.cnblogs.com/wangtianxj/archive/2009/06/29/1513306.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

本文在上文的基础上重新实现支持多线程的服务器。以下为TCP客户端的程序代码&#xff1a;#!/usr/bin/env python3import sysfrom PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice,QRegExp, Qt)from PyQt5.QtWidgets import (QApplication, QDateEdit, QFrame,…

巧合?模仿还是抄袭?水木年华的《秋日恋歌》和Lube 乐队的《Pozovi Menya Tiho Po Imeni》...

今天听到了俄罗斯的Lube 乐队的《Pozovi Menya Tiho Po Imeni》&#xff0c;前奏感觉很好熟悉&#xff0c;继续听&#xff0c;有种似曾相识的感觉&#xff0c;曲风和演唱风格都很熟悉&#xff0c;我极力的回忆&#xff0c;依稀想起水木年华有一首《莫斯科的黄昏》的演唱风格是在…

UOS简单评测

一位网友安装了UOS系统&#xff0c;并录制了视频&#xff0c;这位网友告知&#xff0c;UOS使用中无卡顿&#xff0c;比较流畅。以下为机器的硬件配置。就操作系统最关键的软件生态而言&#xff0c;UOS自带40多款原创应用和一个有2000多款优质应用的商店&#xff0c;包括微信、Q…

python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

1.轮廓发现轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法&#xff0c;所以边缘提取的阈值选定会影响最终轮廓发现结果。1.1发现轮廓在此步骤中我们会使用到findContours这个API&#xff0c;其原型为&#xff1a;cv2.findContours(image, mode, method[, contours[, hier…

今天,送你一份交通行业最全数据集(共享单车、自动驾驶、网约出租车、交通信号识别)

近几年来共享单车、自动驾驶等交通行业发展得如荼如火&#xff0c;小编也一直有意识地收集相关数据集&#xff0c;经过长时间的积累和沉淀&#xff0c;已经拥有将近300G的交通数据&#xff0c;内容涵盖国内外“自动驾驶”、“共享单车”、“网约出租车”、“交通信号识别”等方…

空谈Saas都扯淡,让你看看真正的云计算

最近“虚拟化”的话题似乎热度有所降低&#xff0c;而“云计算”的概念却不断升温&#xff0c;就连Vmware的新的服务器虚拟化产品&#xff0c;都要加上一个第一款“云计算”操作系统&#xff0c;而正如hubisheng兄弟在《名头不小&#xff01;&#xff01;VMware vSphere实为VI升…

重要的是改变命运,而非升职加薪

阅读本文大概需要4分钟。写公众号以来&#xff0c;被问的最多的问题就是工作选择。在这件事上&#xff0c;很多读者明显会更重视薪资、福利、Title&#xff0c;而不是&#xff1a;未来会怎么样。就在昨天&#xff0c;又有一个读者问我Offer选择的问题&#xff0c;给出建议后&am…

python中的成员运算符是干嘛的_在Python中使用成员运算符的示例

下表列出了所有Python语言支持的成员运算符。例如&#xff1a;试试下面的例子就明白了所有的Python编程语言提供会员运算符&#xff1a;#!/usr/bin/pythona 10b 20list [1, 2, 3, 4, 5 ];if ( a in list ):print "Line 1 - a is available in the given list"else…

前方高能 | 你写过什么有趣的程序?最后一个笑出猪叫

苍冥 说&#xff1a;我们从高一到高三都强制采用图形计算器&#xff0c;可以画函数图像的那种。我们用的是德州仪器系列&#xff0c;Ti-Nspire&#xff0c;贵的要死要死的。然而我却买错了计算器的制式&#xff0c;便宜货&#xff0c;相比其他同学的系统少了很多重要的功能。作…

鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -

鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -鼠标鼠标的故障分析与维修比较简单&#xff0c;大部分故障为接口或按键接触不良、断线、机械定位系统污垢等原因造成的。少数故障为鼠标内部元器件或电路虚焊造成的&#xff0c;这主要存在于某些劣质产品中&#xff0c;其中…

php mysql 云虚拟机_虚拟机+apache+php+mysql 环境安装配置

虚拟机的安装&#xff1a;直接下一步即可&#xff0c;注意修改路径。安装完成后新建虚拟机&#xff0c;直接下一步。如果选择镜像文件后出现错误&#xff0c;可以试着去修改电脑bios中的虚拟化设置&#xff0c;改为enable&#xff0c;如下图&#xff1a;apache安装&#xff1a;…

python逐行读取数据时出现错误_python如何逐行读取数据

在实际开发的过程中&#xff0c;文件读写也很重要&#xff0c;下面说一下python如何逐行读取文件。如果程序要读取行&#xff0c;通常只能用文本方式来读取&#xff0c;道理很简单&#xff0c;只有文本文件才有行的概念&#xff0c;二进制文件没有所谓行的概念。文件对象提供了…

日志框架NLog之将日志发送到邮件

背景NLog可以将日志输出到不同的媒介上&#xff0c;邮件是其中一个&#xff0c;通过邮件可以让我们第一时间收到信息。使用SMTP协议通过电子邮件发送日志消息。与FallbackGroup Target很好地结合在一起&#xff0c;以创建具有多个SMTP主机的后备。配置语法<targets><t…

简单六步,用数据说服你的听众

“相比表格&#xff0c;利用数据图展现数据的方法有可观的优势。庞大的数据令人厌烦&#xff0c;普通人在其中根本获取不到有用的信息&#xff0c;就像从黄瓜里面汲取不到阳光一样。”——摘取自《Economic and Industrial Delusions》一书&#xff0c;作者Arthur Briggs Farqu…

CCNA第五章WAN连接

转载于:https://blog.51cto.com/centrevy/176434

探索 .NET Core 依赖注入的 IServiceCollection

如果您使用了.NET Core&#xff0c;则很可能已使用Microsoft.Extensions.DependencyInjection中的内置依赖项注入容器&#xff0c;在本文中&#xff0c;我想更深入地了解Microsoft Dependency Injection&#xff08;DI&#xff09;容器中的 IServiceCollection。什么是依赖注入…

dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径

一、查看文件安装路径由于软件安装的地方不止一个地方&#xff0c;所有先说查看文件安装的所有路径(地址)。这里以mysql为例。比如说我安装了mysql,但是不知道文件都安装在哪些地方、放在哪些文件夹里&#xff0c;可以用下面的命令查看所有的文件路径在终端输入&#xff1a;whe…

看完这13张图,不得不佩服还是外国人会玩人工智能

对于程序员来说&#xff0c;机器学习领域无疑充满着巨大的诱惑和挑战&#xff0c;很多人对里面复杂的概念和算法头疼不已&#xff0c;那么&#xff0c;有没有一套对新手既友好又明了&#xff0c;对老手能加深印象&#xff0c;不断复习的学习办法呢&#xff1f;有&#xff0c;今…

python通过封装可以实现代码复用_Python学习笔记(五)函数和代码复用

函数能提高应用的模块性&#xff0c;和代码的重复利用率。在很多高级语言中&#xff0c;都可以使用函数实现多种功能。在之前的学习中&#xff0c;相信你已经知道Python提供了许多内建函数&#xff0c;比如print()。同样&#xff0c;你也可以自己创建函数&#xff0c;这被叫做用…

实用的网络命令汇总

通过ping检测网络故障的典型次序 正常情况下&#xff0c;当你使用ping命令来查找问题所在或检验网络运行情况时&#xff0c;你需要使用许多ping命令&#xff0c;如果所有都运行正确&#xff0c;你就可以相信基本的连通性和配置参数没有问题&#xff1b;如果某些ping命令出现运行…