将Qt、OpenGL、GLSL以及Qt的Graphics-View框架结合
九月份都快过去了,学生们也都开学了,我想校园也会热闹许多吧,在CSDN上也相应地热闹了一些。中秋节也过去了,自己身边还有很多没有吃完的月饼,于是将月饼作为早餐每天早上吃一个,希望这样不会浪费。
这个月的事情比较多,又比较忙,所以这么晚才能抽出时间写出一篇。这回介绍一下Qt对OpenGL的支持情况,话说半月前,我参加了上海地区的Qt研讨会,Digia那边的工程师介绍了一下Qt的发展情况,以及QML、Qt for Android、Boot to Qt的情况,让我们这些初学者们对Qt有了新的认识,现在Qt的模块非常庞大,Qt的贡献者有很多,使用Qt的人就更多了,估计有好几百万吧,它们或多或少使用着Qt的相关技术或部分技术,可以说,Qt正在默默地改变软件开发,使用Qt的人一定会越来越多的。
会上工程师回答了在座提出的各种问题,客观地说,有些问题实在是非常深奥,都扯上嵌入式那边去了,我只有听的份了。然后工程师回答了我一个关于Qt5和Graphics-View的问题,目前可以说处于这样的一种状态吧,Qt的QWidget大家族已经成熟,不会得到太大的发展了,而随着Qt5的发展,新的界面类会崭露头角,比如QWindow、QSurface、QScreen这些类。但现在的状况(Qt5.2即将出了),这些类和模块并不会对现有的GUI模块造成威胁,更不用说取代Qt4的GUI(在Qt5是QtGui和QtWidgets)模块了。自Qt4.4起,Qt拥有了Graphics-View框架,使用这个框架可以更加轻松地在窗口中嵌入任意你想要绘制的元素。但是据我所知,Qt5的那些类无法和Graphics-View框架进行整合,对于想要利用Qt中Graphics-View框架的同行们,只能退回Qt4的类进行开发了,Qt5的这些类对于创建纯OpenGL还是有利的。
在qt-project论坛上,有人提问如何实现底层是OpenGL渲染,上层是控件,其实Qt中有一个非常有代表性的例子程序,它叫boxes,看了它的人想必都会觉得它非常惊艳吧。以前没有时间去研究,这会儿我话了大概一个月的空余时间将其研究出来,并仿制了一个小程序,与君共勉。
此程序使用了Qt的core、gui、widgets和opengl模块,渲染了一个3ds模型。建模水平烂,就先凑合吧。下面是程序的截图:
演示程序下载地址:这里
程序源代码下载地址:这里
public class CheckIdCard { /** * 校验银行卡卡号 * * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); if (bit == 'N') { return false; } return cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 * * @param nonCheckCodeCardId * @return */ public static char getBankCardCheckCode(String nonCheckCodeCardId) { if (nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0 || !nonCheckCodeCardId.matches("\\d+")) { // 如果传的不是数据返回N return 'N'; } char[] chs = nonCheckCodeCardId.trim().toCharArray(); int luhmSum = 0; for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) { int k = chs[i] - '0'; if (j % 2 == 0) { k *= 2; k = k / 10 + k % 10; } luhmSum += k; } return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0'); } }
在XMPP通讯开发-服务器连接 中我们成功连接到服务器上面,然后进入到主界面,接下来就是获取好友列表,这里我们分段开发,首先就是界面的设计,这里仿照QQ好友界面,里面的数据先是用模拟的,下一章获取服务器上面的信息然后在替换,先看一下界面效果
其实界面设计很简单,主要用到JTabbedPane,然后使用JTree将数据添加进来,最后在把JTree添加到JTabbedPane中,代码如下:
/** * 添加好友列表的功能:模拟数据 */ private void initFriends(){ // Container contentPane = friends String[] zu = {"朋友", "客户"}; String[] friends = {"张三","汪小明","泰勒"}; String[] customer = {"慧明", "菲菲"}; Hashtable hashtable = new Hashtable(); hashtable.put(zu[0], friends); hashtable.put(zu[1], customer); JTree tree = new JTree(hashtable); JScrollPane scrollPane = new JScrollPane(); scrollPane.setViewportView(tree); jTabbedPane.addTab("好 友", scrollPane); }
当然用过用户多的话会进行滚动的,这里我只是添加了一个而已。
源码项目:https://github.com/jwzhangjie/IChat_PC.git