zqt_helper 轻松开发Qt5 Widgets应用
目标:
1. 代码更加紧凑,所写即所到。
2. 代码层次更直观,直接反映界面窗口层次关系。
3. 不继承类,不重写虚函数,slot接收QEvent。
4. 简单写布局,忘掉api函数。
5. 免去一大堆临时变量的变量名。
思路:
operator () (QLayout*) 开始一个布局
operator () (QWidget*) 开始一个窗口元素,并将元素加入到布局
operator [] <T> (const T&) 设置布局或窗口元素的属性
operator [] (lambda) 设置一个元素的事件回调
zqt_helper项目地址https://github.com/bbqz007/zhelper-qt5Widgets, 适用于Qt5 Widgets。
zwx_helper项目地址https://github.com/bbqz007/zhelper-wxWidgets , 适用于 wxWidgets。
使用zqt_helper如何写Qt Widgets 布局:
layout::begin // 最外层垂直布局
(new QVBoxLayout)
[ QMargins() ]
(layout::begin // 第一个水平布局
(new QHBoxLayout)
(new QLineEdit)
["input txt 1"] // id
[ QSize() ] // 设置大小
(new QPushButton)
["input btn 1"] // id
[ QSize() ]
[ ONSIGNAL( // 设置slot,同时定义slot
&QPushButton::clicked,
[=] (bool) {
// handle slot
})]
(layout::end)) (layout::begin // 第二个水平布局
(new QHBoxLayout)
(new QListWidget)
["list"] // id
[ QSize() ]
(layout::end))
(layout::end,
[=](QLayout*){
// 完成布局后回调
}) ;
基本上可以不调用具体QLayout和QWidget的函数,也免去了记住这些函数。没有声明过一个变量名。
如果希望更加细致的设置可以在 operator[ ] 设置ONLOAD回调:
(new QTableWidget)
["table 1"] // id
[ ONLOAD [=](QTableWidget* table) {
// 设置table }]
Qt虽然有signal-slot机制,支持动态回调绑定,但是对于一些事件(QEvent 如输入设备,窗口管理等事件),你必须继承QWidget,重写对应的事件虚函数。这里提供一个ZQ模板类,将QWidget所有事件虚函数由ZQEmitter代理signal发射,也就是你可以通过slot接收这些事件,而不必去多写一个继承类。尤其是为了弹出菜单就要多写一个继承类。
用slot接收QEvent:
(new ZQ<QFrame>)
["frame 1"] // id
[ ONSIGNAL(
&QFrame::contextMenuEvent,
[=] (QContextMenuEvent*) {
// 弹出菜单
})]
zqt_helper 同样支持 menu布局,如果你没有搞明QMenu和QAction,没有关系,你可以忘记。
menu::begin
(new QMenu)
("level 1 item 1")
[ TRIGGERED [=]() {
// do sth
} ]
("level 1 item 2")
[ TRIGGERED [=]() {
// do sth
} ]
(menu::begin
("level 1 item 3")
("level 2 item 1")
("level 2 item 2")
[ TRIGGERED [=]() {
// do sth
} ]
(menu::end))
(menu::end);
zqt_helper支持QTableWidget
QTableWidget* table = new QTableWidget;
// 设置水平header
column::begin(table)
("header col 1")
[ QFont() ]
[ QColor() ]
("header col 2")
("header col 3")
("header col 4")
(column::end);
// 添加行内容
row::begin(table)
("row1 col1")
("row1 col2")
("row1 col3")
("row1 col4")
(row::another)
("row2 col1")
("row2 col2")
("row2 col3")
("row2 col4")
(row::end);
// 修改单元
cell::begin(table)
(, ) // 定位
[ "change@ row2 col3" ]
(, )
[ "change@ row1 col4" ]
(cell::end);
zqt_helper项目是zwx_helper项目的qt5版本,支持同样的编程方法。
zqt_helper项目地址https://github.com/bbqz007/zhelper-qt5Widgets, 适用于Qt5 Widgets。
zwx_helper项目地址https://github.com/bbqz007/zhelper-wxWidgets , 适用于 wxWidgets。
两个项目同样提供一个gui4smali的demo。
zqt_helper 轻松开发Qt5 Widgets应用的更多相关文章
- VS轻松开发Node.js应用
PTVS开发团队又开发出一款可以在VS里编写Node.js应用程序的插件--NTVS(Node.js Tools for Visual Studio),开发者可以在VS里轻松开发Node.js应用. ...
- 開始开发 Dashboard Widgets,第2章,读书笔记
文件夹:http://blog.csdn.net/wide288/article/details/40298693 主要内容: widgets 的组成是什么. 怎么创建 info.plist 文件 怎 ...
- 自动驾驶轻松开发?华为云ModelArts赋能智慧出行
作为战略新兴产业,人工智能已经开始广泛应用于多个领域.近几年,科技公司.互联网公司等各领域的企业纷纷布局自动驾驶.那么,自动驾驶技术究竟发展得如何了?日前,华为云携手上海交通大学创新中心举办的华为云人 ...
- 学会C sharp计算机编程语言 轻松开发财务、统计软件
就像人们用同一种语言才可以顺畅交流一样,语言是计算机编程的根本,是IT世界交流的工具.运用这些计算机语言,人们可以创造出一个美妙的世界.你点击某个网页或是安装一个应用程序软件,这简简单单动作的背后,就 ...
- 不懂技术也可以轻松开发一款APP
这是个衣食住行都离不开手机的时代,甚至可以说,我们不用考虑其他的东西,只要拿着手机,就可以出门做自己想做的事情. 这就是手机app的强大之处,覆盖面极广,小到聊天交友,大到投资理财.每次都是app为我 ...
- 使用TopShelf轻松开发Window服务
关于TopShelf 描述: Topshelf is a framework for hosting services written using the .NET framework. The cr ...
- zwx_helper 只用小括号()和中括号[ ] 轻松开发wxWidgets
https://github.com/bbqz007/zhelper-wxWidgets https://github.com/bbqz007/zhelper-wxWidgets/tree/maste ...
- 配置CLion作为Qt5开发环境
使用Qt进行程序开发时QtCreator总是不二之选.作为老牌IDE在提供了强大的功能同时也对Qt的支持做了许多优化.如果没有特别的原因你应该使用它. 然而一个顺手的工具将会极大得提升生产效率,而如果 ...
- I.MX6 ubuntu-core-14.04 Apache php mysql Qt5
/*************************************************************************** * I.MX6 ubuntu-core-14. ...
随机推荐
- Redis介绍及字符串操作
一.前言 不同程序之间实现通信的方法? A.通过不同程序之间建立socket,实现通信.实际应用适用于使用broker,如RabbitMQ,ZeroMQ. B.通过Json,Pickle,利用文件的写 ...
- CF1335E Three Blocks Palindrome
就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...
- startUML简单使用教程
最近在startUML上画图搞得我一个头两个大,找了一些比较实用的小方法分享给大家. 类图是可视化地表现类的属性和方法,以及类与类之间的关系. 1.类 a.类 普通实体类,它有对应的属性和方法: 双击 ...
- Phoenix and Distribution(字典序贪心)
\(给定一串字母,分成k份,使得最大字典序最小.(字母可以任意组合)\) \(------------------------------issue~------------------------\ ...
- Synchronized 和 ReentrantLock (Lock )的区别
原始构成 Synchronized 是关键字,属于JVM层面,底层是通过 monitorenter 和 monitorexit 完成,依赖于 monitor 对象来完成.由于 wait/notify ...
- Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...
- 如何将项目发布到npm仓库
有时候,我们希望将项目里的模块提升为公共模块,以便其他项目也能使用.在前端可以将模块发布到npm仓库,这样所有项目都可以通过 npm install youProject 使用模块了. 这个过程很简单 ...
- python语法学习第十天--魔法方法
魔法方法二!!! 属性访问:在对属性任何操作时,都会调用 有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...
- LeetCode链表专题
链表 套路总结 1.多个指针 移动 2.虚假链表头:凡是有可能删除头节点的都创建一个虚拟头节点,代码可以少一些判断(需要用到首部前一个元素的时候就加虚拟头指针) 3.快慢指针 如leetcode160 ...