From 2021.02.21

从前,有一只小鹿,一只小熊,和一只小兔子。
他们度过了很多春夏秋冬。
他们生活在一个生长着七彩树的森林里。
他们看过了不同的阳光穿透不同颜色的叶子。
他们在很多不同地方睡觉。
他们有时候逃亡,有时候安定。
他们互相分享共同成长。
后来小鹿爱上了另一只小鹿,
他走了。
接着小熊又爱上了另一只小熊,
他也走了。
小兔子没有爱上其他的兔子,
但他搬家了。
搬到没有七彩树,没有璀璨阳光的山谷里。
时间缓慢流淌,
像曾经他们屋前的小溪。
小鹿有一次路过,
看到了破败的屋子。
小熊有一次在周围找蜜顺便来看看,
看到了一片青苔满布的废墟。
小兔子一生也没回来过,
那房子还是那样,
再后来,
一只听说了他们故事的鸟儿,
要来这里看看,
他站在溪边望去
他不知道该往哪里看,到处都是花,到处都是树,到处都是蘑菇,到处都是小草。
故事,
是发生在这里吗?
小鸟在这里失声痛哭。

From 2020.12.14

虽然我今年在股票上赚取了十几万元,对于一些人来说,不多,但是对于我,是一种激励与证明,回想起之前失败的亏损时光,那是一段宝贵的经验。
没有人的股票投资生涯是一帆风顺的,你总是要付出一些学费,在跌倒的路上自己默默的爬起来,然后重新整理出发。
这一路真的很寂寞,学习宏观/微观经济学,会被人嘲笑,你学了有什么用?然后尝试学习行为经济学、商业模式、财报、各种投资书籍;还是被人嘲笑,学了用不上,有什么用?但是我不管别人质疑的眼光,坚定的持续学习。
经历过亏损甚至一度吃不上饭还不起债的人有一个好,那就是生死看淡,心态平稳。股价短期的涨跌,只是股民们的情绪波动,与企业价值无关;好的美玉,掉入垃圾桶,它还是美玉;一块普通的石头,哪怕吹的价值上天,它总归是一块石头而已;反而更应该关注那些有价值投资的公司。
市场上,真正能够长期成长的股票,真的不多。因此,可以说,大部分股票都是博弈的游戏,不值得长期持有。
但是,历史数据也告诉我们,能利用市场情绪在股市里长期赚到钱的人,也极其罕见。
相反,因为贪小便宜,想利用市场波动短线走位,结果却错失了大机会的投资者,却十分常见。所以,炒股要挣钱,别贪小便宜。
我们的身边,都可以看见这样一些投资者:这类投资者每次市场下跌,就在市场扫货,目标只是赚一波快钱。在赚取了蝇头小利或者市场陷入横盘后,便迅速卖出。
这类投资者,看似聪明,收益其实未必就好。
一只股票出现调整,如果能在低位买到,两三天之间就能赚个10%。这种跌出来的黄金坑,每只股票一年都会有好几次。
每次10%,当然非常好。可是,在跌市里,相信这些投资者也不会仓位太重,一般只会少量持仓。这样,总的回报就要打折,一年能有超10%的回报,可能就已经是非常罕见了。
如果与长期持有一只好股票,这样的收益就显得有些寒碜了。比如投资贵州茅台这样的公司,只要拿着,放弃短期差价,这样的投资者早已是赚的盆满钵满。
与长期持股相比,热衷短线的投资者不知道需要多少次大跌和黄金坑,多少次的精彩走位,才能炒出这样的回报?!
最后,股票投资,第一心态很重要;第二需要不断的学习金融、经济、投资、历史相关的东西;第三注意身体健康,不然赚钱了,钱都给医院或者没有命花啦。

这个话题并不是一个新的话题,网上有前辈做过详细的描述(Mixing Objective-C, C++ and Objective-C++: an Updated Summary)。之所以做为一篇文章,是因为在实际项目中用到了这种混合,加以记录。

首先需要澄清的是,Objective-C是strict superset of C。C++是基于C语言的面向对象的扩充,但不是strict superset of C。Objective-C++是Objective-C的扩展,使得Objective-C可以链接C++代码。通常情况下,要使用Objective-C++,需要将.m源文件改成.mm源文件。

其次需要澄清的是,Objective-C代码跟C++代码是不能混合使用的,也就是说,Objective-C的头文件中是看不到C++的头文件的。当然,C++的头文件是看不到Objective-C的头文件的。只有Objective-C++文件(也就是.mm文件)可以看到Objective-C的头文件和C++的头文件。

正因为Objective-C和C++互相不能见到对方的头文件,那么就意味着,现有的C++的代码库,想要在Objective-C中使用,是需要封装的,通常,这种封装是借助于Objective-C++写成的Wrapper.

另一方面,Wrapper本身也有技巧,那就是使用Objective-C的class extension特性(或者使用Pointer to implementation设计模式),避免将C++头文件暴露给Objective-C(否则无法编译通过)。具体细节可以参考文章开头的链接。

背景

在使用Qt给MacOS上的截图工具实现自动选中窗口区域需求的时候,原理无非就是获得桌面上可见的所有窗口的坐标以及尺寸,再将这些数据用一个结构体封装起来,按照在桌面的Z序进行排序,最后对鼠标的移动事件进行判断,按照Z序去对鼠标是否在某个窗口的矩形范围内进行判断,直到找到在范围内的矩形,这就是我们要自动选中的矩形了,如果将所有窗口都遍历完了还没发现鼠标正在某个矩形内的话,就不进行自动选中操作。

在Windows下我们可以很方便的使用EnumWindows这个Win32 API去获得桌面上所有窗口的坐标和尺寸,Win32 API可以由C++很方便的调用,而在MacOS上,单纯的使用C++仿佛无法获得我需要的这些数据,于是只好使用Apple的Objective-C提供的接口去获得这些数据。

通过在苹果开发者文档找到了MacOS上很多获得窗口信息的接口,使用CGWindowListCopyWindowInfo就能得到每个窗口的具体数据,接下来我们就要开始Qt与Objective-C混合编程了。

Objective-C是一种在C的基础上加入面向对象特性扩充而成的编程语言,通常称为jObC和较少用的 Objective C或ObjC。在一定程度上,可以把 Objective-C看成是ANSI版本C语言的一个超集,它支持相同的C语言基本语法,同时它还扩展了标准的 ANSI C语言的语法,包括定义类、方法和属性。当然还有其他一些结构的完善和拓展,如类别(Category)的出现。

所以Objective-c是可以直接调用C语言的,那么能否直接调用C++呢?答案是肯定的。

Objective-C源文件介绍

首先我要说一下Objective-C的源文件,后缀是.m或.mm,在.mm文件里,可以直接使用C++代码。所以,我们要混合Qt代码与Objective-C代码,就需要在Qt项目里加入mm文件。

而要混合Objective-C代码,需要更改一下pro文件,添加mm文件,如果有用到MacOS的API的话,则可能还需要添加MacOS的Framework。

添加源文件,需要在.pro中使用OBJECTIVE_SOURCES这个变量,如下所示:

OBJECTIVE_SOURCE += \
Getallvisiblewndpos.mm

添加头文件,需要在.pro中使用OBJECTIVE_HEADERS这个变量,如下所示:

OBJECTIVE_HEADERS += \
getallvisiblewndpos.h

添加Framework,需要在.pro中使用LIBS这个变量,如下所示:

LIBS += -framework CoreGraphics
LIBS += -framework CoreFoundation

混合代码

要使用MacOS提供的框架,需要在.mm文件内包含相关的头文件,又有几部分工作要做。一个是在.pro文件里加入Framework路径,使用LIBS变量即可,不多说了。另外一点是在mm文件内包含Objective-C的头文件,与C++头文件一个理儿,不过使用Objective-C的头文件要使用#import,而使用C++的头文件要使用#include,且所有的#include要写在#import的上面。

需要注意的是,凡是出现了Objective-C源代码和头文件的文件都需要将拓展名改成.mm,只有这样编译器在编译的时候才会既认识Objective-C代码,又认识C++代码。

注意事项

当遇到链接失败的问题时,如下图所示:

通常都是因为只引入了头文件而没有引入对应的Framework,通过在苹果开发者文档或者在Xcode中查找对应的Framework并添加到.pro文件中加以解决。

附赠Qt下Objective-C获得MacOS下所有窗口坐标、尺寸、Z序的方式:

//getAllVisibleWndPos.h
#ifndef GETALLVISIBLEWNDPOS_H
#define GETALLVISIBLEWNDPOS_H

#include <QRect>
#include <QList>
#include <vector>

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import <CoreGraphics/CGWindow.h>
#import <CoreFoundation/CFArray.h>

struct WND_INFO{
	int layer;//Z序
	int index;//序号
	QRect pos;
};

bool CompareWNDINFO(const WND_INFO& A , const WND_INFO& B);
QList<WND_INFO> GetAllVisibleWndPos();

#endif // GETALLVISIBLEWNDPOS_H
//getAllVisibleWndPos.mm
#import <getallvisiblewndpos.h>

bool CompareWNDINFO(const WND_INFO& A , const WND_INFO& B)
{
	if(A.layer == B.layer)
	{
		return A.index < B.index;
	}
	if(A.layer > B.layer && B.layer > 0)
	{
		return true;
	}
	if(A.layer < B.layer && A.layer > 0)
	{
		return false;
	}
	return A.layer == 0;
}

QList<WND_INFO> GetAllVisibleWndPos()
{
	std::vector<WND_INFO> vec;
	CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements , kCGNullWindowID);
	CFIndex cnt = CFArrayGetCount(windowList);
	for (CFIndex i = 0; i < cnt ; i++)
	{
		NSDictionary *dict = (NSDictionary* )CFArrayGetValueAtIndex(windowList , i);
		int layer = 0;
		CFNumberRef numberRef = (__bridge CFNumberRef) dict[@"kCGWindowLayer"];
		CFNumberGetValue(numberRef , kCFNumberSInt32Type , &layer);
		if(layer < 0)
			continue;
		CGRect windowRect;
		CGRectMakeWithDictionaryRepresentation((__bridge CFDictionaryRef)(dict[@"kCGWindowBounds"]) , &windowRect);
		
		QRectF pos;
		pos.setRect(windowRect.origin.x , windowRect.origin.y , windowRect.size.width , windowRect.size,height);
		
		WND_INFO info;
		info.layer = layer;
		info.pos.setRect(pos.x() , pos.y() , pos.width() , pos.height());
		info.index = i;
		
		vec.push_back(info);
	}
	
	std::sort(vec.begin() , vec.end() , CompareWNDINFO);
	QList<WND_INFO> list;
	for(int i = 0 ; i < vec.size() ; i++)
	{
		list.push_back(vec[i]);
	}
	return list;
}

Windows下打包Qt应用程序

在Qt Creator下用Release编译一遍程序,生成相应的exe文件。

 在Qt Creator下编译好的Release下的exe 拷贝到一个新建的文件夹下面;在开始菜单搜索Qt,找到如图这个命令行程序(命令行程序的版本必须与你使用的编译器版本严格对应,否则打包出来的程序将无法正常运行),然后运行。

打开QT命令行,然后利用cd语句进入你拷贝的exe文件放在的文件夹下; 如:”cd C:\Users\Final\Desktop\XXX”,接着运行命令行语句:”windeployqt XXX.exe”(XXX.exe用你的exe文件名替代),然后文件夹下就会出现所有QT依赖。

然后将这个文件夹打包好就可以发布了。如果需要将所有的dll以及其他资源文件全部打包成一个exe,我们可以使用Engima Virtual Box这款软件进行打包。

MacOS下打包Qt应用程序

在Qt Creator下用Release编译一遍程序,生成相应的应用程序。

然后找到Qt安装目录下的macdeployqt,比如在我的安装目录下该文件在“/users/dxf/Qt5.9.0/clang_64/bin/”目录,其中Qt5.9.0以及clang_64分别代表Qt的版本和Qt使用的C++编译器,在使用macdeployqt的时候Qt版本以及使用的编译器必须和编译时使用的Qt库版本及编译器严格对应,否则程序运行阶段将会出现不可预知的问题。

将macdeployqt拖入终端中,然后将你的应用程序也拖入终端中,如图所示,执行相应的打包命令,我们的Qt应用程序的所有依赖的库就会被打入应用程序中了。

如果需要打包成MacOS下的dmg文件,只需在命令行后加上-dmg即可,如图所示。

在Windows下对打包的应用程序进行压缩

在对Qt应用程序进行打包之后,这时候就会看到Qt已经把需要用到的DLL都复制过来了。如果觉得这时候整个程序比较大的话,可以根据需要去掉一些东东:

  • libEGL.dll,libGLESV2.dll这两个文件是ANGLE的文件,可以去掉。opengl32sw.dll是软件模拟OpenGL使用到的,除非用户的系统连DirectX支持都不完整——虚拟机环境就是这样——不然这个文件也完全没有用。 QtWidgets/C++程序都不用OpenGL,所以直接去掉即可。可在调用 windeployqt.exe时加”–no-angle”和”–no-opengl-sw”这两个参数。
  • 如果没有使用svg的话,iconenginesqsvgicon.dll, imageformatsqsvg.dll,Qt5Svg.dll这三个文件也可以删掉。
  • 如果没有对应用程序做国际化处理的话,translations里面的翻译文件也可以删掉。
  • QML程序没有使用QtWidgets/C++,可以删掉Qt5Widgets.dll。
  • 如果imageformats目录里面有几种图像格式没用上,也可以删掉。我自己通常把整个目录都删掉,Qt已经编译了png的支持,能读写程序包含的图标就够,其它格式不重要。
  • qmltooling和Qt5Network.dll是用于QML调试用的,可以删掉。

经过以上裁剪,使用7zip压缩完以后,一个QtWidgets/C++的HelloWorld程序最终只剩下5.64M,一个 QtControls程序是5.86M, QtQuick程序还会更小一些。

通常情况下,只需要platforms\qwindows.dll、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll四个。Qt 5拆得那么散就是想解决这个问题。所以不要打包所有的dll,用到哪个就加哪个。

关于Qt版本对应用程序大小的影响

如果你用的Qt版本为Qt 5.x甚至Qt6.x,5.x和6.x增加了很多新特性的确大了一些。
如果只是写个小程序,不需要5.x的新特性,那么推荐Qt 4.7.x/4.8.x。

Qt适合三种场景:

  • 必须跨平台项目
  • 大项目,代码行数在30万+
  • Qt铁杆粉的项目

这三种场景下,安装包大小都不是主要问题。

减小安装包的方法也很简单:自己编译Qt库。
在configure的时候去掉RTTI,异常,Qt3支持,优化选项用最小大小(性能差不了太多)。
如果你的程序真的很小,那么可以直接静态链接,这样就更小了。

MacOS下应用程序“XXX”不能打开

当MacOS下的应用程序在传输过程中有遇到过压缩的话,经常会遇到「应用程序“XXX”不能打开」的提示,这是由于应用经过压缩和解压之后,其中的可执行文件的权限被抹除,导致无法打开。下面以ScreenShot应用为例子,解决一下这个问题。

1、右击该应用,选择“显示包内容”。

2、依次打开“Content”、“MacOS”目录,找到ScreenShot文件,我们会发现这个文件变成了文本编辑文稿类型的文件,而实际上这个文件应该为Unix可执行文件,由于在压缩的过程中权限丢失,所以这个文件变成了类型不明的文件,导致应用无法打开。

3、打开终端,输入“chmod +x”,注意“chmod”和“+x”中间有个空格,然后再输入空格,将ScreenShot文件拖入终端,接着按回车键执行指令。“chmod +x ScreenShot”的意思就是给ScreenShot这个文件执行权限的意思。

4、执行完这条命令之后,ScreenShot就被成功给予了执行权限,变成了Unix执行文件,这时这个应用就可以正常运行了。

From 2020.11.27

在资本家眼里,你只不过是没有价值的生瓜蛋子。在乎你的感受?不好意思,没时间修补你的玻璃心。你又没什么价值,不想干滚蛋,有的是人干,又不是缺你不可。
我很佩服那些一身本领,既能为公司创造价值又能实现自我价值,毅然决然裸辞潇洒走一回的人,他们或是休息调整找到更好的工作,或是旅行读书充电创业,不断提升自己。
怕被人知道自己过得不好,那么你必须一个人承受,一个人挣扎,一个人做决定。现实却是前怕狼后怕虎,畏手畏脚,逃避现实,不敢开始,害怕失败。
人一闲下来就废了。

枚举值键值备注
Key_Escape0x01000000Esc键(左上角)
Key_Tab0x01000001Tab键(制表键)
Key_Backtab0x01000002Shift+Tab
Key_BackTabKey_Backtab与Key_Backtab键值相同,但在Qt3版本使用
Key_Backspace0x01000003退格(回格)
Key_BackSpaceKey_Backspace与Key_Backspace键值相同,但在Qt3版本使用
Key_Return0x01000004字母键盘回车
Key_Enter0x01000005数字键盘回车
Key_Insert0x01000006插入
Key_Delete0x01000007删除
Key_Pause0x01000008暂停中断
Key_Print0x01000009打印
Key_SysReq0x0100000a系统请求键
Key_Clear0x0100000b清除
Key_Home0x01000010光标移动到起始值
Key_End0x01000011结束
Key_Left0x01000012左键
Key_Up0x01000013上键
Key_Right0x01000014右键
Key_Down0x01000015下键
Key_PageUp0x01000016上页
Key_PriorKey_PageUp与Key_PageUp键值相同,但在Qt3版本使用
Key_PageDown0x01000017下页
Key_NextKey_PageDown与Key_PageDown键值相同,但在Qt3版本使用
Key_Shift0x01000020上档(调节器),通常用于组合按键使用
Key_Control0x01000021控制键,通常用于组合按键使用
Key_Meta0x01000022变换按键,现代计算机键盘一般无此键,此键通常用Alt键或者Windows键仿真
Key_Alt0x01000023替换键,通常用于组合按键使用
Key_CapsLock0x01000024大写锁定
Key_NumLock0x01000025数码锁定
Key_ScrollLock0x01000026滚动锁定
Key_F10x01000030功能键F1
Key_F20x01000031功能键F2
Key_F30x01000032功能键F3
Key_F40x01000033功能键F4
Key_F50x01000034功能键F5
Key_F60x01000035功能键F6
Key_F70x01000036功能键F7
Key_F80x01000037功能键F8
Key_F90x01000038功能键F9
Key_F100x01000039功能键F10
Key_F110x0100003a功能键F11
Key_F120x0100003b功能键F12
Key_F130x0100003c功能键F13
Key_F140x0100003d功能键F14
Key_F150x0100003e功能键F15
Key_F160x0100003f功能键F16
Key_F170x01000040功能键F17
Key_F180x01000041功能键F18
Key_F190x01000042功能键F19
Key_F200x01000043功能键F20
Key_F210x01000044功能键F21
Key_F220x01000045功能键F22
Key_F230x01000046功能键F23
Key_F240x01000047功能键F24
Key_F250x01000048功能键F25(X11系统独有)
Key_F260x01000049功能键F26(X11系统独有)
Key_F270x0100004a功能键F27(X11系统独有)
Key_F280x0100004b功能键F28(X11系统独有)
Key_F290x0100004c功能键F29(X11系统独有)
Key_F300x0100004d功能键F30(X11系统独有)
Key_F310x0100004e功能键F31(X11系统独有)
Key_F320x0100004f功能键F32(X11系统独有)
Key_F330x01000050功能键F33(X11系统独有)
Key_F340x01000051功能键F34(X11系统独有)
Key_F350x01000052功能键F35(X11系统独有)
Key_Super_L0x01000053左超级按键(Window系统下左边键盘徽标)
Key_Super_R0x01000054右超级按键(Window系统下右边键盘徽标)
Key_Menu0x01000055菜单
Key_Hyper_L0x01000056左Hyper按键
Key_Hyper_R0x01000057右Hyper按键
Key_Help0x01000058帮助
Key_Direction_L0x01000059左方向按键
Key_Direction_R0x01000060右方向按键
Key_Space0x20空格键(7位可打印ASCII)
Key_AnyKey_Space与Key_Space键值相同,但在Qt3版本使用
Key_Exclam0x21!
Key_QuoteDbl0x22\
Key_NumberSign0x23#
Key_Dollar0x24$
Key_Percent0x25%
Key_Ampersand0x26&
Key_Apostrophe0x27
Key_ParenLeft0x28(
Key_ParenRight0x29)
Key_Asterisk0x2a*
Key_Plus0x2b+
Key_Comma0x2c,
Key_Minus0x2d
Key_Period0x2e.
Key_Slash0x2f/
Key_00x300
Key_10x311
Key_20x322
Key_30x333
Key_40x344
Key_50x355
Key_60x366
Key_70x377
Key_80x388
Key_90x399
Key_Colon0x3a:
Key_Semicolon0x3b;
Key_Less0x3c<
Key_Equal0x3d=
Key_Greater0x3e>
Key_Question0x3f?
Key_At0x40@
Key_A0x41A
Key_B0x42B
Key_C0x43C
Key_D0x44D
Key_E0x45E
Key_F0x46F
Key_G0x47G
Key_H0x48H
Key_I0x49I
Key_J0x4aJ
Key_K0x4bK
Key_L0x4cL
Key_M0x4dM
Key_N0x4eN
Key_O0x4fO
Key_P0x50P
Key_Q0x51Q
Key_R0x52R
Key_S0x53S
Key_T0x54T
Key_U0x55U
Key_V0x56V
Key_W0x57W
Key_X0x58X
Key_Y0x59Y
Key_Z0x5aZ
Key_BracketLeft0x5b[
Key_Backslash0x5c\
Key_BracketRight0x5d]
Key_AsciiCircum0x5e^
Key_Underscore0x5f_
Key_QuoteLeft0x60`
Key_BraceLeft0x7b{
Key_Bar0x7c\
Key_BraceRight0x7d}
Key_AsciiTilde0x7e~
Key_nobreakspace0x0a0不间断空格
Key_exclamdown0x0a1
Key_cent0x0a2
Key_sterling0x0a3英国货币;标准纯银;英镑
Key_currency0x0a4货币
Key_yen0x0a5日元
Key_brokenbar0x0a6间断条(仅供参考)
Key_section0x0a7分区(仅供参考)
Key_diaeresis0x0a8分音符(仅供参考)
Key_copyright0x0a9版权(仅供参考)
Key_ordfeminine0x0aa女性(仅供参考)
Key_guillemotleft0x0ab左引号
Key_notsign0x0ac告示牌(仅供参考)
Key_hyphen0x0ad连字号(仅供参考)
Key_registered0x0ae注册(仅供参考)
Key_macron0x0af长音符号(加于元音上)(仅供参考)
Key_degree0x0b0度数(仅供参考)
Key_plusminus0x0b1加减符(仅供参考)
Key_twosuperior0x0b2两个优势(仅供参考)
Key_threesuperior0x0b3三个优势(仅供参考)
Key_acute0x0b4加剧(仅供参考)
Key_mu0x0b5希腊字母第12字(仅供参考)
Key_paragraph0x0b6段落;分段符号(仅供参考)
Key_periodcentered0x0b7有圆心的句号”.”(仅供参考)
Key_cedilla0x0b8变音符号(仅供参考)
Key_onesuperior0x0b9一个优势(仅供参考)
Key_masculine0x0ba男性(仅供参考)
Key_guillemotright0x0bb直角引号(仅供参考)
Key_onequarter0x0bc四分之一(仅供参考)
Key_onehalf0x0bd二分之一(仅供参考)
Key_threequarters0x0be四分之三(仅供参考)
Key_questiondown0x0bf下一个问题(仅供参考)
Key_Agrave0x0c0
Key_Aacute0x0c1
Key_Acircumflex0x0c2
Key_Atilde0x0c3
Key_Adiaeresis0x0c4
Key_Aring0x0c5
Key_AE0x0c6
Key_Ccedilla0x0c7
Key_Egrave0x0c8
Key_Eacute0x0c9
Key_Ecircumflex0x0ca
Key_Ediaeresis0x0cb
Key_Igrave0x0cc
Key_Iacute0x0cd
Key_Icircumflex0x0ce
Key_Idiaeresis0x0cf
Key_ETH0x0d0
Key_Ntilde0x0d1
Key_Ograve0x0d2
Key_Oacute0x0d3
Key_Ocircumflex0x0d4
Key_Otilde0x0d5
Key_Odiaeresis0x0d6
Key_multiply0x0d7
Key_Ooblique0x0d8
Key_Ugrave0x0d9
Key_Uacute0x0da
Key_Ucircumflex0x0db
Key_Udiaeresis0x0dc
Key_Yacute0x0dd
Key_THORN0x0de
Key_ssharp0x0df
Key_agraveKey_Agrave
Key_aacuteKey_Aacute
Key_acircumflexKey_Acircumflex
Key_atildeKey_Atilde
Key_adiaeresisKey_Adiaeresis
Key_aringKey_Aring
Key_aeKey_AE
Key_ccedillaKey_Ccedilla
Key_egraveKey_Egrave
Key_eacuteKey_Eacute
Key_ecircumflexKey_Ecircumflex
Key_ediaeresisKey_Ediaeresis
Key_igraveKey_Igrave
Key_iacuteKey_Iacute
Key_icircumflexKey_Icircumflex
Key_idiaeresisKey_Idiaeresis
Key_ethKey_ETH
Key_ntildeKey_Ntilde
Key_ograveKey_Ograve
Key_oacuteKey_Oacute
Key_ocircumflexKey_Ocircumflex
Key_otildeKey_Otilde
Key_odiaeresisKey_Odiaeresis
Key_division0x0f7
Key_oslashKey_Ooblique
Key_ugraveKey_Ugrave
Key_uacuteKey_Uacute
Key_ucircumflexKey_Ucircumflex
Key_udiaeresisKey_Udiaeresis
Key_yacuteKey_Yacute
Key_thornKey_THORN
Key_ydiaeresis0x0ff
// International input method support (X keycode – 0xEE00, the definition follows Qt/Embedded 2.3.7) Only interesting if you are writing your own input method. International & multi-key character composition
Key_AltGr0x01001103
Key_Multi_key0x01001120Multi-key character compose
Key_Codeinput0x01001137
Key_SingleCandidate0x0100113c
Key_MultipleCandidate0x0100113d
Key_PreviousCandidate0x0100113e
// Misc Functions
Key_Mode_switch0x0100117eCharacter set switch
// Key_script_switch = 0x0100117e, // Alias for mode_switch
// Japanese keyboard support
Key_Kanji0x01001121Kanji, Kanji convert
Key_Muhenkan0x01001122Cancel Conversion
// Key_Henkan_Mode = 0x01001123, // Start/Stop Conversion
Key_Henkan0x01001123Alias for Henkan_Mode
Key_Romaji0x01001124to Romaji
Key_Hiragana0x01001125to Hiragana
Key_Katakana0x01001126to Katakana
Key_Hiragana_Katakana0x01001127Hiragana/Katakana toggle
Key_Zenkaku0x01001128to Zenkaku
Key_Hankaku0x01001129to Hankaku
Key_Zenkaku_Hankaku0x0100112aZenkaku/Hankaku toggle
Key_Touroku0x0100112bAdd to Dictionary
Key_Massyo0x0100112cDelete from Dictionary
Key_Kana_Lock0x0100112dKana Lock
Key_Kana_Shift0x0100112eKana Shift
Key_Eisu_Shift0x0100112fAlphanumeric Shift
Key_Eisu_toggle0x01001130Alphanumeric toggle
//Key_Kanji_Bangou = 0x01001137, // Codeinput
//Key_Zen_Koho = 0x0100113d, // Multiple/All Candidate(s)
//Key_Mae_Koho = 0x0100113e, // Previous Candidate
// Korean keyboard support
// In fact, many Korean users need only 2 keys, Key_Hangul and
// Key_Hangul_Hanja. But rest of the keys are good for future.
Key_Hangul0x01001131Hangul start/stop(toggle)
Key_Hangul_Start0x01001132Hangul start
Key_Hangul_End0x01001133Hangul end, English start
Key_Hangul_Hanja0x01001134Start Hangul->Hanja Conversion
Key_Hangul_Jamo0x01001135Hangul Jamo mode
Key_Hangul_Romaja0x01001136Hangul Romaja mode
//Key_Hangul_Codeinput0x01001137, // Hangul code input mode
Key_Hangul_Jeonja0x01001138Jeonja mode
Key_Hangul_Banja0x01001139Banja mode
Key_Hangul_PreHanja0x0100113aPre Hanja conversion
Key_Hangul_PostHanja0x0100113bPost Hanja conversion
//Key_Hangul_SingleCandidate = 0x0100113c, // Single candidate
//Key_Hangul_MultipleCandidate = 0x0100113d, // Multiple candidate
//Key_Hangul_PreviousCandidate = 0x0100113e, // Previous candidate
Key_Hangul_Special0x0100113fSpecial symbols
//Key_Hangul_switch = 0x0100117e, // Alias for mode_switch
// dead keys (X keycode – 0xED00 to avoid the conflict)
Key_Dead_Grave0x01001250
Key_Dead_Acute0x01001251
Key_Dead_Circumflex0x01001252
Key_Dead_Tilde0x01001253
Key_Dead_Macron0x01001254
Key_Dead_Breve0x01001255
Key_Dead_Abovedot0x01001256
Key_Dead_Diaeresis0x01001257
Key_Dead_Abovering0x01001258
Key_Dead_Doubleacute0x01001259
Key_Dead_Caron0x0100125a
Key_Dead_Cedilla0x0100125b
Key_Dead_Ogonek0x0100125c
Key_Dead_Iota0x0100125d
Key_Dead_Voiced_Sound0x0100125e
Key_Dead_Semivoiced_Sound0x0100125f
Key_Dead_Belowdot0x01001260
Key_Dead_Hook0x01001261
Key_Dead_Horn0x01001262
// multimedia/internet keys – ignored by default – see QKeyEvent c’tor
Key_Back0x01000061
Key_Forward0x01000062
Key_Stop0x01000063
Key_Refresh0x01000064
Key_VolumeDown0x01000070
Key_VolumeMute0x01000071
Key_VolumeUp0x01000072
Key_BassBoost0x01000073
Key_BassUp0x01000074
Key_BassDown0x01000075
Key_TrebleUp0x01000076
Key_TrebleDown0x01000077
Key_MediaPlay0x01000080
Key_MediaStop0x01000081
Key_MediaPrevious0x01000082
Key_MediaPrevKey_MediaPrevious
Key_MediaNext0x01000083
Key_MediaRecord0x01000084
Key_MediaPause0x1000085
Key_MediaTogglePlayPause0x1000086
Key_HomePage0x01000090
Key_Favorites0x01000091
Key_Search0x01000092
Key_Standby0x01000093
Key_OpenUrl0x01000094
Key_LaunchMail0x010000a0
Key_LaunchMedia0x010000a1
Key_Launch00x010000a2
Key_Launch10x010000a3
Key_Launch20x010000a4
Key_Launch30x010000a5
Key_Launch40x010000a6
Key_Launch50x010000a7
Key_Launch60x010000a8
Key_Launch70x010000a9
Key_Launch80x010000aa
Key_Launch90x010000ab
Key_LaunchA0x010000ac
Key_LaunchB0x010000ad
Key_LaunchC0x010000ae
Key_LaunchD0x010000af
Key_LaunchE0x010000b0
Key_LaunchF0x010000b1
Key_MonBrightnessUp0x010000b2
Key_MonBrightnessDown0x010000b3
Key_KeyboardLightOnOff0x010000b4
Key_KeyboardBrightnessUp0x010000b5
Key_KeyboardBrightnessDown0x010000b6
Key_PowerOff0x010000b7
Key_WakeUp0x010000b8
Key_Eject0x010000b9
Key_ScreenSaver0x010000ba
Key_WWW0x010000bb
Key_Memo0x010000bc
Key_LightBulb0x010000bd
Key_Shop0x010000be
Key_History0x010000bf
Key_AddFavorite0x010000c0
Key_HotLinks0x010000c1
Key_BrightnessAdjust0x010000c2
Key_Finance0x010000c3
Key_Community0x010000c4
Key_AudioRewind0x010000c5
Key_BackForward0x010000c6
Key_ApplicationLeft0x010000c7
Key_ApplicationRight0x010000c8
Key_Book0x010000c9
Key_CD0x010000ca
Key_Calculator0x010000cb
Key_ToDoList0x010000cc
Key_ClearGrab0x010000cd
Key_Close0x010000ce
Key_Copy0x010000cf
Key_Cut0x010000d0
Key_Display0x010000d1
Key_DOS0x010000d2
Key_Documents0x010000d3
Key_Excel0x010000d4
Key_Explorer0x010000d5
Key_Game0x010000d6
Key_Go0x010000d7
Key_iTouch0x010000d8
Key_LogOff0x010000d9
Key_Market0x010000da
Key_Meeting0x010000db
Key_MenuKB0x010000dc
Key_MenuPB0x010000dd
Key_MySites0x010000de
Key_News0x010000df
Key_OfficeHome0x010000e0
Key_Option0x010000e1
Key_Paste0x010000e2
Key_Phone0x010000e3
Key_Calendar0x010000e4
Key_Reply0x010000e5
Key_Reload0x010000e6
Key_RotateWindows0x010000e7
Key_RotationPB0x010000e8
Key_RotationKB0x010000e9
Key_Save0x010000ea
Key_Send0x010000eb
Key_Spell0x010000ec
Key_SplitScreen0x010000ed
Key_Support0x010000ee
Key_TaskPane0x010000ef
Key_Terminal0x010000f0
Key_Tools0x010000f1
Key_Travel0x010000f2
Key_Video0x010000f3
Key_Word0x010000f4
Key_Xfer0x010000f5
Key_ZoomIn0x010000f6
Key_ZoomOut0x010000f7
Key_Away0x010000f8
Key_Messenger0x010000f9
Key_WebCam0x010000fa
Key_MailForward0x010000fb
Key_Pictures0x010000fc
Key_Music0x010000fd
Key_Battery0x010000fe
Key_Bluetooth0x010000ff
Key_WLAN0x01000100
Key_UWB0x01000101
Key_AudioForward0x01000102
Key_AudioRepeat0x01000103
Key_AudioRandomPlay0x01000104
Key_Subtitle0x01000105
Key_AudioCycleTrack0x01000106
Key_Time0x01000107
Key_Hibernate0x01000108
Key_View0x01000109
Key_TopMenu0x0100010a
Key_PowerDown0x0100010b
Key_Suspend0x0100010c
Key_ContrastAdjust0x0100010d
Key_LaunchG0x0100010e
Key_LaunchH0x0100010f
Key_MediaLast0x0100ffff
// Keypad navigation keys
Key_Select0x01010000
Key_Yes0x01010001
Key_No0x01010002
// Newer misc keys
Key_Cancel0x01020001
Key_Printer0x01020002
Key_Execute0x01020003
Key_Sleep0x01020004
Key_Play0x01020005Not the same as Key_MediaPlay
Key_Zoom0x01020006
// Key_Jisho = 0x01020007, // IME: Dictionary key
// Key_Oyayubi_Left = 0x01020008, // IME: Left Oyayubi key
// Key_Oyayubi_Right = 0x01020009, // IME: Right Oyayubi key
// Device keys
Key_Context10x01100000
Key_Context20x01100001
Key_Context30x01100002
Key_Context40x01100003
Key_Call0x01100004set absolute state to in a call (do not toggle state)
Key_Hangup0x01100005set absolute state to hang up (do not toggle state)
Key_Flip0x01100006
Key_ToggleCallHangup0x01100007a toggle key for answering, or hanging up, based on current call state
Key_VoiceDial0x01100008
Key_LastNumberRedial0x01100009
Key_Camera0x01100020
Key_CameraFocus0x01100021
Key_unknown0x01ffffff

Qt键盘的一个小知识

Qt::Key_ReturnQt::Key_Enter比较

相同之处

  • Qt::Key_ReturnQt::Key_Enter都是回车键.

不同之处

  • Qt::Key_Return是字母键盘的回车键;
  • Qt::Key_Enter则为数字键盘的回车键.

看了下时间,此时已是凌晨01:17分,辗转难眠的我,空洞的双眼显得些许木纳,脑海一片空白的自己也不知道在想什么。

其实哪有什么好失眠的啊,不过是日常熬夜成瘾,一旦闲下来早睡也睡不着罢了。

大字躺着望着乌漆麻黑的天花板发呆的我,索性任性不睡了,那就竖起耳朵倾听着时间走向天亮吧。

这个点,阳台外面早已褪去了人群来往的喧嚣,不过偶尔还是会传来车经过的声响。

有的司机像是在着急赶路一样“呼”的一声飞驰而过;有的则像极了新手上路缓缓行走的车轮温柔地抚摸着洒落在街道上的月光,生怕把它的影子碾碎一般。

唯一相同的是,黄亮的车前灯伴着月光穿过围墙,透过窗台依然是那么刺眼,似乎在赤裸裸地挑衅着宣告它已经看光了所有,你不必躲躲藏藏。

我想,此时那条温顺的小狗应该和往常一样吧,会一如既往地乖巧地躺在守夜阿姨的身旁,默默地陪伴着看守着这凄清的街道。

但我并不敢起身去验证这个猜想,因为我害怕啊。

我害怕看到的是忠诚的小狗也有坚持不住每天都守护着主人的那一天,只剩下阿姨落寞的形影单只,孤单地守着本就孤单的夜晚。

其实主要是因为我胆小。

放在床头边乘凉的小风扇机械地在运转着,振动的嘎嘎声像是它发出疲倦呻吟的求救信号一般地荡漾在我耳边。

已远去的夏天,炎热却并没有随着跟走。我哪有那么大的慈悲让它停下来稍微歇息一会,哪怕一小会啊。

运转扇风本就是它活着的使命,谁不在疲惫的活着呢。

忘记了这是第几个凌晨还没睡,也忘记了多久没有十二点前睡着过了。

老实说,每天杂七杂八忙忙碌碌的生活,我都不知道自己在忙了些什么,但又真的没空。大概这就是混日子最后反被日子混了的结果吧。

记得,以前老师说过眼前辛苦点好好学习过后上了大学就轻松了,可我似乎并没有感到过一刻轻松。

我甚至不知道是我上了大学还是大学上了我,除了做不完的作业还是作业,恨不得时光倒流回去只需要一个脑袋栽进学习里就好了的高中生活。

每天由己或者身不由己的熬夜成瘾,一日复一日里成了死循环。想要改变的决心还没有萌生一秒,意识里就已经发出了否的反抗,可笑的是理由还挺理所应当。

不是不害怕过自己会突然毫无征兆的猝死在某一天的深夜里,可是比起死亡我更害怕活不下去。

活下去的压力一个又一个的接踵而来,死亡显得反倒像是一种奢望的解脱,只是有点不负责罢了。

那既然这样,还是接着好好熬夜好好生活下去吧。

也没什么不好的,至少能醒着感知这个世界多一点点。

From 2020.10.25

对你而言,未来是黑暗,是迷雾,也许是平川万里,也许是万丈深渊。每步都要小心翼翼,每步都要提心吊胆。
但谁要抢我们的东西,伤害我们仅有的那些朋友和亲人,那么哪怕明知前方是地狱是深渊,我们也会义无反顾地跳下去,只为将伤害我们的,驱逐出我们的领地。
现在的我都已经带学毕业了,我可能终其一生是个普通人呐。
可我还是多年前那个又衰又怂的死小孩。还是那个不肯争抢却又会在某个时刻全力以赴的死小孩。
我知道你也是。
生日快乐,死小孩。@马勒隔壁老王的靴子