关于这QT黄金矿工单机版小游戏这版游戏网上是不是很少

收藏的论坛
QT语音军团版本“黄金三小时”重磅来袭
  《》联手QT语音软件推出的QT语音军团版本全新更新,全新开黑系统席卷而来。玩家开黑酣战之余,QT语音&黄金三小时&活动也正式开启,珍贵奖品大放送!   QT语音军团12月26日至28日期间,&黄金三小时&活动正式开启。玩家在活动期间每晚8点至11点参与军团答题、军团召集令,攒功勋,即能获得三重好礼。    军团答题  在QT军团版的&黄金三小时&活动里,玩家在每晚8、9、10整点参与军团答题,即能增加2点功勋。届时,军团内所有成员都可参与&黄金三小时&活动,题目内容围绕《英雄联盟》,对于大多数玩家来讲并不难,即便是部分难题在军团成员的提醒下也能迎刃而解。准时参加答题,成为玩家积攒功勋的重要途径,还有机会获得黄金三小时答题徽章,限量发布的哦。   军团召集令  &黄金三小时&活动中积攒每日功勋的另一个重要途径则是发布军团召集令,邀请好友一起去开黑。借助QT语音军团的全新功能,玩家将更能轻松地的组建开黑队伍,与好友一起开黑。玩家只需要保证在每晚8-11点期间参与军团内的召集令开黑活动就能积攒2点功勋值。黄金三小时,不仅仅指的是针对活动积攒功勋的黄金时间,更是指玩家参与召集令开黑的黄金时间,让开黑在这三小时中无处不在!   三重大礼相送  玩家通过参与军团答题、发布召集令积攒功勋后可分别活得三重好礼。  第一重是参与狂欢派兑,消耗6点功勋兑换、男枪、妖姬、、沃尔贝利的珍贵皮肤,活动期间每种皮肤限量20W,先兑先得。   第二重是参与幸运转盘抽奖,消耗5点功勋即可进行一次抽奖,赢取、、等英雄皮肤在内的多重炫酷大礼,不论是道具还是Q币奖励,都价值不菲。   第三重是全区积分排行前1000名的团长将会获得限量版的非卖皮肤,真是实实在在的大放送。   黄金三小时分秒必争,组队召集令忙不停,QT语音为你奉上三重惊喜大奖,赶紧来参与吧!  
近期游戏热闻我购买套餐以后,怎么通知工作室开始代练?
套餐购买成功后,无需您亲自联系工作室说明,5173会发送站内短信及订单留言通知工作室及时代练,当工作室有选择短信服务时,5173还会以手机短信形式通知工作室。
如果我购买以后,发现工作室长期不代练,我可以取消吗?
遇到此类情况,您可以先通过订单留言或其他联系方式与工作室沟通,如无法达成一致结果,您可以进入“我的5173”→“我的代练”→选择“我是玩家”下的“我的代练信息”→具体订单的“订单详细”→“我有问题需要帮助”提交问题,等待客服为您处理。
我看有些套餐后面会显示“认证”,而有些没有,选择认证工作室有什么好处吗?
1.玩家选择认证工作室将享受比普通工作室更优质的代练服务,避免不必要的代练纠纷,享受更多优惠服务。
2.玩家选择认证工作室代练将获得更多的安全保障。在代练期间,因认证工作室责任导致封号、删号、盗号等问题,该工作室部分认证押金将作为额外的赔偿给予玩家(不高于1000元)。
3.申请认证的工作室工作环境、身份信息及信用评价都经过5173代练严格审核,保证玩家的代练质量,请放心选择认证工作室。
4.认证工作室有专属聊天工具,您可通过聊天系统直接和工作室交谈。
如何查看代练进度?
您可以进入“我的5173”→“我的代练”→选择“我是玩家”下的“我的代练信息”→具体订单→“查看截图”,从工作室上传的进度截图了解代练进度。
我怎么样和工作室联系?如果有问题要怎么处理?
1.您可以在“我的5173”→“我的代练”→选择“我是玩家”下的“我的代练信息”→具体订单的“订单详细”查看到工作室的联系方式,双方也可以通过“留言”沟通。(注:如双方有达成修改代练内容的协议,请在订单提交协商结果。)
2.如代练期间出现问题双方无法协商成功,您可以进入“我的5173”→“我的代练”→选择“我是玩家”下的“我的代练信息”→具体订单的“订单详细”→“我有问题需要帮助”提交问题,等待客服为您处理。
如果工作室没有在规定时间内帮我完成代练,我能得到赔偿吗?
工作室代练超过玩家要求时间,将赔付“效率保证金”。超时1%至10%,代练费用全额结算,工作室赔付玩家效率保证金;超时大于10%,代练费用全额退还玩家,并由工作室赔付玩家效率保证金。(注:效率保证金已包含5173交易费用。)
如果代练期间我的号出现问题,比如被盗、被删、被封,有什么赔偿?
代练过程中,因工作室原因导致玩家的游戏帐号被封停(含暂时冻结),将返还玩家所有代练费用,并由工作室赔付相应的安全保证金及效率保证金;因工作室原因导致玩家的游戏帐号被盗号、删号,将视情况返还玩家代练费用,并由工作室赔付玩家相应安全保证金及效率保证金。(注:保证金已包含5173交易费用。)
我怎么知道工作室帮我完成了?我可以自己登录游戏帐号查看吗?
为了代练安全,代练期间玩家是不允许登录游戏帐号的;工作室提交完成后,5173会给您发送站内短信及订单留言给您,请您及时查看并登录游戏帐号验收;如您不方便经常上网,建议您在购买套餐时候选择手机短信通知,当代练完成时5173会给您发送手机短信通知您。
若您还有其他问题,请进入进行咨询。
代练完成,提交验收&
双方协商结算订单
您需要先,才能向工作室提问。
您可在购买前咨询该工作室代练单的区服、时间、价格等问题,其他用户仅供参考!(请勿询问或提供任何联系方式)
悄悄话,只有对方才能看到此留言
我需要同时发送该信息到工作室手机上(资费:0.2元/条)
请与工作室充份沟通后再下单购买!
免责声明:5173所展示的商品供求信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。
亲爱的用户,在您购买物品之前,如有任何的疑问,都可以咨询以下的客服。
热销:1-110只要80元★飞行解锁H萨墓108元★ 10万碎片只要125元
货比三家!3万好评!萨墓本,飞行解锁,世界任务包月练级半价!LOL玩家瞧不起《王者荣耀》:一天上黄金 这游戏太简单_网页游戏_金陵热线
当前位置:&>&&>&&>&正文
LOL玩家瞧不起《王者荣耀》:一天上黄金 这游戏太简单
& &腾讯手游《王者荣耀》最近日活破千万,风头正盛,由于&农药&操作简单,玩法简单非常容易上手,让很多《英雄联盟》之外的玩家也可以参加到这类MOBA类游戏里,似乎有赶超LOL的趋势!& &不过很多LOL资深玩家表示,王者荣耀真的是太简单了,一小时就能从青铜打上白银,一天就能从白银打到黄金,一周的时间就能从黄金打到白金,虽然钻石分段稍有困难,但是最多也超不过俩周也能上砖石,小编也是一个资深的王者荣耀和LOL玩家,表示LOL上个黄金真不容易,王者荣耀上白金和闹着玩一样!& &有一位玩家曾经这样比喻王者荣耀和英雄联盟的关系,玩王者荣耀就像吃零食一样,吃的很快,而英雄联盟则是主食,需要慢慢吃!这话说的貌似也蛮有道理,想要享受最有竞技环境的游戏,王者荣耀确实不及英雄联盟,但是从娱乐和休闲的角度上讲,王者荣耀又强于英雄联盟,毕竟人手一个手机玩游戏不要太方便!& &这也从另一个方面解释了为什么现在王者荣耀怎么火,但是看王者荣耀联赛KPL的观众却很少,倒是英雄联盟不但游戏玩家数量庞大,从这款游戏衍生出来的游戏赛事现在也做的非常好,LOL已经成为了全球电子竞技最火热的游戏,而全球也有数十个赛区,每年联赛杯赛都是有很多,世界赛更是热度不输NBA!& &王者荣耀确实现在玩家人数,已经超过了英雄联盟,作为端游LOL它时间地点的局限性,在现在快节奏的社会里,已经暴露无遗,但是从游戏的竞技性和观赏度而言,王者荣耀也是无法取代英雄联盟在电子竞技圈里的地位,就像网友们总结的那样,王者荣耀就是一道快餐,而真正的美味还是英雄联盟!
(责任编辑:jl514)
金陵热线热点频道:
免责声明:本(栏目、频道等)内容由SP提供。欢迎大家对侵犯版权等不合法和不健康的内容进行监督和举报。
[增值电信业务经营许可证A2.B1.B2-]&[文网文[号]&[国新网许可证:]&
版权所有:中国电信股份有限公司南京分公司&&技术支持:江苏知能邮电通信技术有限公司当前位置: >>
Qt教程及软件
Qt Creator 系列教程 网站专题类: 专题类: 方块游戏系列 教程 连载类: 一、Qt Creator 的安装和 hello world 程序的编写 二、Qt Creator 编写多窗口程序 三、Qt Creator 登录对话框 四、Qt Creator 添加菜单图标 五、Qt Creator 布局管理器的使用 六、Qt Creator 实现文本编
辑 七、Qt Creator 实现文本查找 八、Qt Creator 实现状态栏显示 九、Qt Creator 中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator 中实现定时器和产生随机数 十一、Qt 2D 绘图(一)绘制简单图形 十二、Qt 2D 绘图(二)渐变填充 十三、Qt 2D 绘图(三)绘制文字 十四、Qt 2D 绘图(四)绘制路径 十五、Qt 2D 绘图(五)显示图片 十六、Qt 2D 绘图(六)坐标系统 十七、Qt 2D 绘图(七)Qt 坐标系统深入 Qt 串口通信专题 Qt 涂鸦板程序图文详细 十八、Qt 2D 绘图(八)涂鸦板 十九、Qt 2D 绘图(九)双缓冲绘图简介 二十、Qt 2D 绘图(十)图形视图框架简介 二十一、Qt 数据库(一)简介 二十二、Qt 数据库(二)添加 MySQL 数据库驱动插件 二十三、Qt 数据库(三)利用 QSqlQuery 类执行 SQL 语句(一) 二十四、Qt 数据库(四)利用 QSqlQuery 类执行 SQL 语句(二) 二十五、Qt 数据库(五)QSqlQueryModel 二十六、Qt 数据库(六)QSqlTableModel 二十七、Qt 数据库(七)QSqlRelationalTableModel 二十八、Qt 数据库(八)XML(一) 二十九、Qt 数据库(九)XML(二) 三十、Qt 数据库(十)XML(三) 三十一、Qt 4.7.0 及 Qt Creator 2.0 beta 版安装全程图解 三十二、第一个 Qt Quick 程序(QML 程序) 三十三、体验 QML 演示程序 三十四、Qt Quick Designer 介绍 三十五、QML 组件 三十六、QML 项目之 Image 和 BorderImage 三十七、Flipable、Flickable 和状态与动画 三十八、QML 视图 三十九、QtDeclarative 模块 四十、使用 Nokia Qt SDK 开发 Symbian 和 Maemo 终端软件 四十一、Qt 网络(一)简介 四十二、Qt 网络(二)HTTP 编程 四十三、Qt 网络(三)FTP(一) 四十四、Qt 网络(四)FTP(二) 四十五、Qt 网络(五)获取本机网络信息 四十六、Qt 网络(六)UDP 四十七、Qt 网络(七)TCP(一) 四十八、Qt 网络(八)TCP(二) 第一款软件: 多文档编辑器 第二款软件: 音乐播放器 第三款软件: 局域网聊天工具 (局域网聊天工具 07 月 17 日更新,添加文本智能编辑 功能) 第四款软件: Wincom 串口调试软件(附有 Lincom 的源码) 期待? ?网友的 Qt 相关文章1.在线教程-Qt 参考文档 2.Qt 学习之路文章列表 3.Qt 的 graphics View 框架 4.AT2440EVB_II+WINCE5.0 板上跑 QT 程序 5.架设移动开发环境:Qt-wince 平台 6.OpenGL 贴图问题(转帖) 7.OpenGL 实现场景漫游(转帖) 8.上网本版 MeeGo 1.0 正式发布,核心软件平台支持 N900(转载) 9.MeeGo 为 Linux 带来魔法(转载) 10.Maemo ,青涩的机会,辽远的未来(转载) 11.Qt 编写 Mplayer 前端程序(转载)一、Qt Creator 的安装和 hello world 程序的编 写本文章原创于
转载请注明出处。 我们这里讲述 windows 下的 Qt Creator,在 Linux 下基本相同。本文先 讲述基本的下载、安装和最简单程序的编写,然后在附录里又讲解了两 种其他的编写程序的方法。 1.首先到 Qt 的官方网站上下载 Qt Creator, 这里我们下载 windows 版的。 下载地址:/downloads 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。2.运行 Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各 种演示程序。 3.我们用 File-&New 菜单来新建工程。4.这里我们选择 Qt4 Gui Application。5.下面输入工程名和要保存到的文件夹路径。 我们这里的工程名为 hello world。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功 能,所以直接点击 Next。7.我们将 base class 选为 QDialog 对话框类。然后点击 Next。8.点击 Finish,完成工程的建立。9.我们可以看见工程中的所有文件都出现在列表中了。 我们可以直接按下 下面的绿色的 run 按钮或者按下 Ctrl+R 快捷键运行程序。10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的 dialog.ui 文件,便出现了下面所示的图形界面 编辑界面。12.我们在右边的器件栏里找到 Label 标签器件13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为 hello world。15.我们在右下角的属性栏里将字体大小由 9 改为 15。16.我们拖动标签一角的蓝点,将全部文字显示出来。17.再次按下运行按钮,便会出现 hello world。到这里 hello world 程序便完成了。 Qt Creator 编译的程序,在其工程文件夹下会有一个 debug 文件夹,其 中有程序的.exe 可执行文件。但 Qt Creator 默认是用动态链接的,就是 可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件, 首先可能显示“没有找到 mingwm10.dll,因此这个应用程序未能启动。 重新安装应用程序可能会修复此问题。”表示缺少 mingwm10.dll 文件。 解决这个问题我们可以将相应的.dll 文件放 到系统中。在 Qt Creator 的安装目录的 qt 文件下的 bin 文件夹下(我安 装在了 D 盘,所以路径是 D:\Qt\2009.04\qt\bin),可以找到所有的相 关.dll 文件。 方法一: 在这里找到 mingwm10.dll 文件, 将其复制到 C:\WINDOWS\system 文件夹下即可。下面再提示缺少什么 dll 文件,都像这样解决就可以了。 方法二:将这些 dll 文件都与.exe 文件放到同一个文件夹下。不过这样 每个.exe 文件都要放一次。方法三:将 D:\Qt\2009.04\qt\bin 加入系统 Path 环境变量。右击我的电脑-&属性-&高级-& 环境变量-&在系统变量列表中找到 Path,将路径加入其中即可。附 1:用纯源码编写。1.新建空的 Qt4 工程。2.工程名为 hello world,并选择工程保存路径(提示:路径中不能有中 文)。 3.在新建好的工程中添加文件。右击工程文件夹,弹出的菜单中选择 Add New。4.选择普通文件。点击 Ok。5.文件名为 main.cpp,点击 Next 进入下一步。 6.这里自动将这个文件添加到了新建的工程中。保持默认设置,点击完 成。7.在 main.cpp 文件中添加代码。8.这时点击运行,程序执行了,但看不到效果,因为程序里什么也没做。 我们点击信息框右上角的红色方块,停止程序运行。9.我们再更改代码。添加一个对话框对象。 10.运行效果如下。11.我们更改代码如下,在对话框上添加一个标签对象,并显示 hello world。12.运行效果如下。附 2:利用 ui 文件。 1.建立新的空工程, 这里的工程名为 hello, 建立好工程后, 添加新文件。 这里添加 Qt Designer Form。2.选择一个对话框做模板。3.你可以更改文件名,我们这里使用默认设置。4.在新建好的框口上添加一个标签,并更改文本为 hello world。 5.在工程文件夹上点击右键,弹出的菜单中选择第一项编译工程。6.因为还没有写主函数,所以现在编译文件会出现错误,不过没关系, 因为我们只是想编译一下 ui 文件。7.点击这个图标,去掉弹出的菜单中第二项前的对勾,显示隐藏的文件。这时你就能看到 ui 文件对应的头文件了。而如果去掉菜单中的第一项前的对勾,列表中的文件就会分类显示,如 图 8.ui 文件对应的.h 文件默认为 ui_dialog.h(例如 form.ui 对应 ui_form.h)。 其中是设计器设计的窗口的对应代码。我们这里的.h 文件是最简单的, 其类名为 Ui_Dialog,可以看到其中有我们添加的标签对象。9.在这个类里有一个 setupUi 函数,我们就是利用这个函数来使用设计 好的窗口的。10.我们添加 main.cpp 文件,并更改内容如下。 其中 ui-&setupUi(dd);一句就是将设计的窗口应用到新建的窗口对象上。11.这时运行程序,效果如下。在这篇文章中我们一共讲述了三种方法写 hello world 程序,其实也就 是两种,一种用设计器,一种全部用代码生成,其实他们是等效的。因 为我们已经看到,就算是设计器生成,其实也是写了一个对应的 ui.h 文 件,只不过这个文件是自动生成的,不用我们自己写而已。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 二、Qt Creator 编写多窗口程序本文章原创于
转载请注明出处。 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口, 如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进 入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话 框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立 一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类 来实现多窗口。 实现过程: 1.首先新建 Qt4 Gui Application 工程,工程名为 nGui,Base class 选 为 QWidget。建立好后工程文件列表如下图。2.新建对话框类,如下图,在新建中,选择 Qt Designer Form Class。 3.选择 Dialog without Buttons。4.类名设为 myDlg。5.点击 Finish 完成。注意这里已经默认将其加入到了我们刚建的工程中 了。6.如下图,在 mydlg.ui 中拖入一个 Push Button,将其上的文本改为“进 入主窗口”,在其属性窗口中将其 objectName 改为 enterBtn,在下面的 Signals and slots editor 中进行信号和槽的关联,其中,Sender 设为 enterBtn,Signal 设为 clicked(),Receive 设为 myDlg,Slot 设为 accept()。这样就实现了单击这个按钮使这个对话框关闭并发出 Accepted 信号的功能。下面我们将利用这个信号。7.修改主函数 main.cpp,如下: #include &QtGui/QApplication& #include “widget.h” #include “mydlg.h” int main(int argc, char *argv[]) { QApplication a(argc, argv); W myDlg my1; 信号判断 enterBtn 是否被按下 { w.show(); 口 return a.exec(); 主窗口关闭 } else return 0; 整个程序结束运行 } 主函数必须这么写,才能完成所要的功能。 如果主函数写成下面这样: #include &QtGui/QApplication& #include “widget.h” #include “mydlg.h” //如果没被按下,则不会进入主窗口, //程序一直执行,直到 //如果被按下,显示主窗 //建立自己新建的类的对象 my1 //利用 Accepted if(my1.exec()==QDialog::Accepted) //加入头文件 int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; if(my1.exec()==QDialog::Accepted) { W w.show(); } return a.exec(); } 这样, 因为 w 是在 if 语句里定义的, 所以当 if 语句执行完后它就无效了。 这样导致的后果就是,按下 enterBtn 后,主界面窗口一闪就没了。如果 此时对程序改动了,再次点击运行时,就会出现 error: collect2: ld returned 1 exit status 的错误。这是因为虽然主窗口没有显示,但它 只是隐藏了,程序并没有结束,而是在后台运行。所以这时改动程序,再 运行时便会出错。你可以按下调试栏上面的红色 Stop 停止按钮来停止程 序运行。你也可以在 windows 任务管理器的进程中将该进程结束,而后再 次运行就没问题了,当然先关闭 Qt Creator,而后再重新打开,这样也 能解决问题。 如果把程序改为这样: #include &QtGui/QApplication& #include “widget.h” #include “mydlg.h” int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; W if(my1.exec()==QDialog::Accepted) { w.show(); } return a.exec(); } 这样虽然解决了上面主窗口一闪而过的问题,但是,如果在 my1 对话框出 现的时候不点 enterBtn,而是直接关闭对话框,那么此时整个程序应该 结束执行,但是事实是这样的吗?如果你此时对程序进行了改动,再次按 下 run 按钮,你会发现又出现了 error: collect2: ld returned 1 exit status 的错误,这说明程序并没有结束,我们可以打开 windows 任务管 理器,可以看到我们的程序仍在执行。 因为 return a.exec();一句表示只要主窗口界面不退出, 那么程序就会一直执行。所以只有用第一种方法,将该语句也放到 if 语 句中,而在 else 语句中用 else return 0; ,这样如果 enterBtn 没有被 按下,那么程序就会结束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出 另一个界面的程序。下面我们在主窗口上加一个按钮,按下该按钮,弹出 一个对话框,但这个对话框关闭,不会使主窗口关闭。 8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上 点击鼠标右键,在弹出的菜单中选择 go to slot。 9.我们选择单击事件 clicked()。10.我们在弹出的槽函数中添加一句: my2.show(); my2 为我们新建对话框类的另一个对象, 但是 my2 我们还没有定义, 所以在 widget.h 文件中添加相应代码,如下,先加入头文件,再加入 my2 的定义语句,这里我们将其放到 private 里,因为一般的函数都放在 public 里,而变量都放在 private 里。 #ifndef WIDGET_H #define WIDGET_H #include &QtGui/QWidget& #include “mydlg.h” namespace Ui { class W } class Widget : public QWidget { Q_OBJECT public: //包含头文件 Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget * myDlg my2; private slots: void on_pushButton_clicked(); }; #endif // WIDGET_H 到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我 们用两种方法实现了信号和槽函数的关联, 第一个按钮我们直接在设计器 中实现其关联;第二个按钮我们自己写了槽函数语句,其实图形的设计与 直接写代码效果是一样的。 这个程序里我们实现了两类窗口打开的方式,一个是自身 消失而后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看 到他们实现的方法是不同的。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 //对 my2 进行定义 三、Qt Creator 登录对话框本文章原创于
转载请注明出处。 实现功能: 在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均 正确则进入主窗口,如果有错则弹出警告对话框。 实现原理: 通过上节的多窗口原理实现由登录对话框进入主窗口, 而用户名和密码可 以用 if 语句进行判断。 实现过程: 1.先新建 Qt4 Gui Application 工程, 工程名为 mainWidget, 选用 QWidget 作为 Base class,这样便建立了主窗口。文件列表如下:2.然后新建一个 Qt Designer Form Class 类,类名为 loginDlg,选用 Dialog without Buttons,将其加入上面的工程中。文件列表如下: 3.在 logindlg.ui 中设计下面的界面:行输入框为 Line Edit。其中用户 名后面的输入框在属性中设置其 object Name 为 usrLineEdit,密码后面 的输入框为 pwdLineEdit,登录按钮为 loginBtn,退出按钮为 exitBtn。4.将 exitBtn 的单击后效果设为退出程序,关联如下:5.右击登录按钮选择 go to slot,再选择 clicked(),然后进入其单击事 件的槽函数,写入一句 void loginDlg::on_loginBtn_clicked() { accept(); } 6.改写 main.cpp: #include &QtGui/QApplication& #include “widget.h” #include “logindlg.h” int main(int argc, char *argv[]) { QApplication a(argc, argv); W loginD if(login.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; } 7.这时执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程 序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg::on_loginBtn_clicked() { if(m_ui-&usrLineEdit-&text()==tr(“qt”)&&m_ui-&pwdLineEdit-&te xt()==tr(“123456″)) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr(“Warning”),tr(“user name or password error!”),QMessageBox::Yes); //如果不正确,弹出警告对话框 } } 并在 logindlg.cpp 中加入#include &QtGui&的头文件。如果不加这个头 文件,QMessageBox 类不可用。 (说明:由于版本原因,现在的程序默认生成的 ui 类对象可能是 ui,而 不是 m_ui,请到 loginDlg.h 中查看。) 9.这时再执行程序,输入用户名为 qt,密码为 123456,按登录按钮便能 进入主窗口了,如果输入错了,就会弹出警告对话框。如果输入错误,便会弹出警告提示框:10.在 logindlg.cpp 的 loginDlg 类构造函数里,添上初始化语句,使密 码显示为小黑点。 loginDlg::loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui::loginDlg) { m_ui-&setupUi(this); m_ui-&pwdLineEdit-&setEchoMode(QLineEdit::Password); } 效果如下:11.如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结 果程序按错误的用户名对待了。我们可以更改 if 判断语句,使这样的输入也算正确。 void loginDlg::on_loginBtn_clicked() { if(m_ui-&usrLineEdit-&text().trimmed()==tr(“qt”)&&m_ui-&pwdLi neEdit-&text()==tr(“123456″)) accept(); else{ QMessageBox::warning(this,tr(“Warning”),tr(“user name or password error!”),QMessageBox::Yes); } } 加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用 户名和密码框清空并且光标自动跳转到用户名输入框, 最终的登录按钮的 单击事件的槽函数如下: void loginDlg::on_loginBtn_clicked() { if(m_ui-&usrLineEdit-&text().trimmed()==tr(“qt”)&&m_ui-&pwdLi neEdit-&text()==tr(“123456″)) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr(“Warning”),tr(“user name or password error!”),QMessageBox::Yes); //如果不正确,弹出警告对话框 m_ui-&usrLineEdit-&clear();//清空用户名输入框 m_ui-&pwdLineEdit-&clear();//清空密码输入框 m_ui-&usrLineEdit-&setFocus();//将光标转到用户名输入框 } } 最终的 loginDlg.cpp 文件如下图:分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 四、Qt Creator 添加菜单图标本文章原创于
转载请注明出处。 在下面的几节,我们讲述 Qt 的 MainWindow 主窗口部件。这一节只讲述怎 样在其上的菜单栏里添加菜单和图标。 1.新建 Qt4 Gui Application 工程,将工程命名为 MainWindow,其他选 项默认即可。 生成的窗口界面如下图。其中最上面的为菜单栏。2.我们在 Type Here 那里双击,并输入“文件(&F)”,这样便可将其文件 菜单的快捷键设为 Alt+F。(注意括号最好用英文半角输入,这样看着美 观) 3.输入完按下 Enter 键确认即可,然后在子菜单中加入“新建(&N)”,确 定后,效果如下图。4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。5.双击这一条,可打开它的编辑对话框。我们看到 Icon 项,这里可以更 改“新建”菜单的图标。6.我们点击后面的?号,进入资源选择器,但现在这里面是空的。所以下 面我们需要给该工程添加外部资源。 7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择 所需图标。另一种是自己写资源文件。我们主要介绍第一种。新建 Qt Resources file,将它命名为 menu。其他默认。8.添加完后如下图。可以看到添加的文件为 menu.qrc。9.我们最好先在工程文件夹里新建一个文件夹,如 images,然后将需要 的图标文件放到其中。10.在 Qt Creator 的 menu.qrc 文件中,我们点击 Add 下拉框,选择 Add Prefix。我们可以将生成的/new/prefix 前缀改为其他名字,如/File。 11.然后再选择 Add 下拉框,选择 Add Files。再弹出的对话框中,我们 到新建的 images 文件夹下,将里面的图标文件全部添加过来。12.添加完成后,我们在 Qt Creator 的 File 菜单里选择 Save All 选项, 保存所做的更改。 (注意:一定要先保存刚才的 qrc 文件,不然在资源管 理器中可能看不见自己添加的资源!)13.这时再打开资源选择器,可以看到我们的图标都在这里了。(注意:如 果不显示,可以按一下上面的 Reload 按钮) 14.我们将 new.png 作为“新建”菜单的图标,然后点击 Shortcut,并按 下 Crtl+N,便能将 Crtl+N 作为“新建”菜单的快捷键。15.这时打开文件菜单,可以看到“新建”菜单已经有图标了。运行程序后效果如下。16.我们在工程文件夹下查看建立的 menu.qrc 文件, 可以用写字板将它打 开。 其具体内容如下。附:第二种添加资源文件的方法。 1.首先右击工程文件夹,在弹出的菜单中选择 Add New,添加新文件。也 可以用 File 中的添加新文件。2.我们选择文本文件。3.将文件名设置为 menu.qrc。 4.添加好文件后将其内容修改如下。可以看到就是用第一种方法生成的 menu.qrc 文件的内容。5.保存文件后,在资源管理器中可以看到添加的图标文件。 五、Qt Creator 布局管理器的使用本文章原创于
转载请注明出处。 上篇讲解了如何在 Qt Creator 中添加资源文件, 并且为菜单添加了图标。 这次我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。 首先对菜单进行完善。 1.我们在上一次的基础上再加入一些常用菜单。 “文件”的子菜单如下图。中间的分割线可以点击 Add Separator 添加。“编辑”子菜单的内容如下。 “帮助”子菜单的内容如下。2.我们在动作编辑器中对各个菜单的属性进行设置。 如下图。3.我们拖动“新建”菜单的图标,将其放到工具栏里。 拖动“新建”菜单的图标。将其放到菜单栏下面的工具栏里。 4.我们再添加其他几个图标。使用 Append Separator 可以添加分割线。5.最终效果如下。 如果需要删除图标, 可以在图标上点击右键选择 Remove action 即可。 下面简述一下布局管理器。 (这里主要以垂直布局管理器进行讲解,其他类型管理器用法与之相同, 其效果可自己验证。) 1.在左边的器件栏里拖入三个 PushButton 和一个 Vertical Layout(垂 直布局管理器)到中心面板。如下图。2.将这三个按钮放入垂直布局管理器,效果如下。可以看到按钮垂直方向 排列,并且宽度可以改变,但高度没有改变。3.我们将布局管理器整体选中,按下上面工具栏的 Break Layout 按钮, 便可取消布局管理器。(我们当然也可以先将按钮移出,再按下 Delete 键将布局管理器删除。)4.下面我们改用分裂器部件(QSplitter)。 先将三个按钮同时选中,再按下上面工具栏的 Lay Out Vertically in Splitter(垂直分裂器)。效果如下图。可以看到按钮的大小可以随之改动。这也就是分裂器和布局 管理器的分别。5.其实布局管理器不但能控制器件的布局,还有个很重要的用途是,它能 使器件的大小随着窗口大小的改变而改变。 我们先在主窗口的中心拖入一个文本编辑器 Text Edit。这时直接运行程序,效果如下。可以看到它的大小和位置不会随着窗口改 变。下面我们选中主窗口部件,然后在空白处点击鼠标右键,选择 Layout-&Lay Out in a Grid,使整个主窗口的中心区处于网格布局管理 器中。可以看到,这时文本编辑器已经占据了整个主窗口的中心区。 运行一下程序,可以看到无论怎样拉伸窗口,文本编辑框的大小都会随之 改变。我们在这里一共讲述了三种使用布局管理器的方法,一种是去器件栏添 加,一种是用工具栏的快捷图标,还有一种是使用鼠标右键的选项。 程序中用到的图标是我从 Ubuntu 中复制的, 可以到资源下载页面下载到。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 六、Qt Creator 实现文本编辑本文章原创于
转载请注明出处。 前面已经将界面做好了, 这里我们为其添加代码, 实现文本编辑的功能。 首先实现新建文件,文件保存,和文件另存为的功能。 (我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大 的程序时,经常对源文件进行备份,是个很好的习惯。) 在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记 事本一样的软件,所以最好先打开 windows 中的记事本,进行一些简单 的操作,然后考虑怎样去实现这些功能。再者,再强大的软件,它的功 能也是一个一个加上去的,不要设想一下子写出所有的功能。我们这里 先实现新建文件,保存文件,和文件另存为三个功能,是因为它们联系 很紧,而且这三个功能总的代码量也不是很大。因为三个功能之间的关系并不复杂,所以我们这里便不再画流程图,而 只是简单描述一下。 新建文件,那么如果有正在编辑的文件,是否需要保存呢? 如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该 先将其另存为。 下面开始按这些关系写程序。 1.打开 Qt Creator,在 File 菜单中选择 Open,然后在工程文件夹中打 开 MainWindow.pro 工程文件。 先在 main.cpp 文件中加入以下语句,让程序中可以使用中文。 在其中加入#include &QTextCodec& 头文件包含,再在主函数中加入下面 一行: QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 这样在程序中使用中文, 便能在运行时显示出来了。 更改后文件如下图。2.在 mainwindow.h 文件中的 private 下加入以下语句。 bool isS //为 true 时标志文件已经保存,为 false 时标志文件尚 未保存 QString curF //保存当前文件的文件名 void do_file_New(); //新建文件 void do_file_SaveOrNot(); //修改过的文件是否保存 void do_file_Save(); //保存文件 void do_file_SaveAs(); //文件另存为 bool saveFile(const QString& fileName); //存储文件 这些是变量和函数的声明。其中 isSaved 变量起到标志的作用,用它来标 志文件是否被保存过。然后我们再在相应的源文件里进行这些函数的定 义。 3.在 mainwindow.cpp 中先加入头文件#include &QtGui&,然后在构造函 数里添加以下几行代码。 isSaved = //初始化文件为未保存过状态 curFile = tr(“未命名.txt”); //初始化文件名为“未命名.txt” setWindowTitle(curFile); //初始化主窗口的标题 这是对主窗口进行初始化。效果如下。 4.然后添加“新建”操作的函数定义。 void MainWindow::do_file_New() //实现新建文件的功能 { do_file_SaveOrNot(); isSaved = curFile = tr(“未命名.txt”); setWindowTitle(curFile); ui-&textEdit-&clear(); //清空文本编辑器 ui-&textEdit-&setVisible(true); //文本编辑器可见 } 新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标 志为未保存过状态。 5.再添加 do_file_SaveOrNot 函数的定义。 void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框 { if(ui-&textEdit-&document()-&isModified()) //如果文件被更改过, 弹出保存对话框 { QMessageB box.setWindowTitle(tr(“警告”)); box.setIcon(QMessageBox::Warning); box.setText(curFile + tr(” 尚未保存,是否保存?”)); box.setStandardButtons(QMessageBox::Yes | QMessageBox::No); if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保 存操作 do_file_Save(); } } 这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。6.再添加“保存”操作的函数定义。 void MainWindow::do_file_Save() //保存文件 { if(isSaved){ //如果文件已经被保存过,直接保存文件 saveFile(curFile); } else{ do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为 } } 对文件进行保存时,先判断其是否已经被保存过,如果没有被保存过,就 要先对其进行另存为操作。 7.下面是“另存为”操作的函数定义。 void MainWindow::do_file_SaveAs() //文件另存为 { QString fileName = QFileDialog::getSaveFileName(this,tr(“另存 为”),curFile); //获得文件名 if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容 { saveFile(fileName); } } 这里弹出一个文件对话框,显示文件另存为的路径。 8.下面是实际文件存储操作的函数定义。 bool MainWindow::saveFile(const QString& fileName) //保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存 成功 { QFile file(fileName); if(!file.open(QFile::WriteOnly | QFile::Text)) //以只写方式打开文件,如果打开失败则弹出提示框并返回 { QMessageBox::warning(this,tr(“保存文件”), tr(“无法保存文件 %1:\n %2″).arg(fileName) .arg(file.errorString())); } //%1,%2 表示后面的两个 arg 参数的值 QTextStream out(&file); //新建流对象,指向选定的文件 //将文本编辑器里的内容以out && ui-&textEdit-&toPlainText(); 纯文本的形式输出到流对象中 isSaved =curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的 标准路径 setWindowTitle(curFile); //将窗口名称改为现在窗口的路径 } 这个函数实现将文本文件进行存储。下面我们对其中的一些代码进行讲 解。 QFile file(fileName);一句,定义了一个 QFile 类的对象 file,其中 filename 表明这个文件就是我们保存的的文件。然后我们就可以用 file 代替这个文件,来进行一些操作。Qt 中文件的操作和 C,C++很相似。对 于 QFile 类对象怎么使用,我们可以查看帮助。 点击 Qt Creator 最左侧的 Help,在其中输入 QFile,在搜索到的列表中选择 QFile 即可。这时在右侧会显示出 QFile 类中所有相关信息以及他们的用法和说明。// 我们往下拉,会发现下面有关于怎么读取文件的示例代码。 //// 再往下便能看到用 QTextStream 类对象,进行字符串输入的例子。下面也 提到了 QFileInfo 和 QDir 等相关的类,我们可以点击它们去看一下具体 的使用说明。 //上面只是做了一个简单的说明。 以后我们对自己不明白的类都可以去帮助 里进行查找,这也许是我们以后要做的最多的一件事了。对于其中的英文 解释,我们最好想办法弄明白它的大意,其实网上也有一些中文的翻译, 但最好还是从一开始就尝试着看英文原版的帮助, 这样以后才不会对中文 翻译产生依赖。 我们这次只是很简单的说明了一下怎样使用帮助文件,这 不表明它不重要,而是因为这里不可能将每个类的帮助都解释一遍,没有 那么多时间,也没有那么大的篇幅。而更重要的是因为,我们这个教程只 是引你入门,所以很多东西需要自己去尝试。 在以后的教程里,如果不是特殊情况,就不会再对其中的 类进行详细解释,文章中的重点是对整个程序的描述,其中不明白的类, 自己查看帮助。 9.双击 mainwindow.ui 文件,在图形界面窗口下面的 Action Editor 动 作编辑器里,我们右击“新建”菜单一条,选择 Go to slot,然后选择 triggered(),进入其触发事件槽函数。 同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数中。 如下。 void MainWindow::on_action_New_triggered() //信号和槽的关联 { do_file_New(); } void MainWindow::on_action_Save_triggered() { do_file_Save(); } void MainWindow::on_action_SaveAs_triggered() { do_file_SaveAs(); } 最终的 mainwindow.cpp 文件如下。 最终的 mainwindow.h 文件如下。这时点击运行,就能够实现新建文件,保存文件,文件另存为的功能了。 然后实现打开,关闭,退出,撤销,复制,剪切,粘贴的功能。 先备份上次的工程文件,然后再将其打开。 1.先在 mainwindow.h 文件中加入函数的声明。 void do_file_Open(); //打开文件 bool do_file_Load(const QString& fileName); //读取文件2.再在 mainwindow.cpp 文件中写函数的功能实现。 void MainWindow::do_file_Open()//打开文件 { do_file_SaveOrNot();//是否需要保存现有文件 QString fileName = QFileDialog::getOpenFileName(this); //获得要打开的文件的名字 if(!fileName.isEmpty())//如果文件名不为空 { do_file_Load(fileName); } ui-&textEdit-&setVisible(true);//文本编辑器可见 } bool MainWindow::do_file_Load(const QString& fileName) //读取文 件 { QFile file(fileName); if(!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this,tr(“读取文件”),tr(“无法读取文 件 %1:\n%2.”).arg(fileName).arg(file.errorString())); } QTextStream in(&file); ui-&textEdit-&setText(in.readAll()); 内容都写到文本编辑器中 curFile = QFileInfo(fileName).canonicalFilePath(); setWindowTitle(curFile); } //将文件中的所有 //如果打开文件失败,弹出对话框,并返回上面的打开文件函数与文件另存为函数相似, 读取文件的函数与文件存储 函数相似。 3.然后按顺序加入更菜单的关联函数,如下。 void MainWindow::on_action_Open_triggered() { do_file_Open(); } // void MainWindow::on_action_Close_triggered() //关闭操作 { do_file_SaveOrNot(); ui-&textEdit-&setVisible(false); } // void MainWindow::on_action_Quit_triggered() //退出操作 { on_action_Close_triggered(); qApp-&quit(); 针 } // void MainWindow::on_action_Undo_triggered() //撤销操作 { ui-&textEdit-&undo(); //先执行关闭操作 //打开操作//再退出系统,qApp 是指向应用程序的全局指 } // void MainWindow::on_action_Cut_triggered() //剪切操作 { ui-&textEdit-&cut(); } // void MainWindow::on_action_Copy_triggered() //复制操作 { ui-&textEdit-&copy(); } // void MainWindow::on_action_Past_triggered() //粘贴操作 { ui-&textEdit-&paste(); } 因为复制,撤销,全选,粘贴,剪切等功能,是 TextEdit 默认就有的, 所以我们只需调用一下相应函数就行。 到这里,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经 实现了。分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 七、Qt Creator 实现文本查找本文章原创于
转载请注明出处。 现在加上查找菜单的功能。因为这里要涉及关于 Qt Creator 的很多实用 功能,所以单独用一篇文章来介绍。 以前都用设计器设计界面, 而这次我们用代码实现一个简单的查找对话框。 对于怎么实现查找功能的, 我们详细地分步说明了怎么进行类中方法的查 找和使用。其中也将 Qt Creator 智能化的代码补全功能和程序中函数的 声明位置和定义位置间的快速切换进行了介绍。 1.首先还是保存以前的工程,然后再将其打开。 我们发现 Qt Creator 默认的字体有点小,可以按下 Ctrl 键的同时按两下 +键,来放大字体。也可以选择 Edit-&Advanced-&Increase Font Size。2.在 mainwindow.h 中加入#include &QLineEdit&的头文件包含,在 private 中添加 QLineEdit *find_textLineE //声明一个行编辑器,用于输入要查找 的内容 在 private slots 中添加 void show_findText(); 在该函数中实现查找字符串的功能。 3.我们进入查找菜单的触发事件槽函数,更改如下。 void MainWindow::on_action_Find_triggered() { QDialog *findDlg = new QDialog(this); //新建一个对话框, 用于查找操作, this 表明它的父窗口是 MainWindow。 findDlg-&setWindowTitle(tr(“查找”)); //设置对话框的标题 find_textLineEdit = new QLineEdit(findDlg); //将行编辑器加入到新建的查找对话框中 QPushButton *find_Btn = new QPushButton(tr(“查找下一 个”),findDlg); //加入一个“查找下一个”的按钮 QVBoxLayout* layout = new QVBoxLayout(findDlg); layout-&addWidget(find_textLineEdit); layout-&addWidget(find_Btn); //新建一个垂直布局管理器,并将行编辑器和按钮加入其中 findDlg -&show(); //显示对话框 connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText())); //设置“查找下一个”按钮的单击事件和其槽函数的关联 } 这里我们直接用代码生成了一个对话框, 其中一个行编辑器可以输入要查 找的字符,一个按钮可以进行查找操作。我们将这两个部件放到了一个垂 直布局管理器中。然后显示这个对话框。并设置了那个按钮单击事件与 show_findText()函数的关联。5.下面我们开始写实现查找功能的 show_findText()函数。 void MainWindow::show_findText()//“查找下一个”按钮的槽函数 { QString findText = find_textLineEdit-&text(); //获取行编辑器中的内容 } 先用一个 QString 类的对象获得要查找的字符。 然后我们一步一步写查找 操作的语句。 6.在下一行写下 ui,然后直接按下键盘上的“&.”键,这时系统会根据 是否是指针对象而自动生成“-&”或“.”,因为 ui 是指针对象,所以自 动生成“-&”号,而且弹出了 ui 中的所有部件名称的列表。如下图。7.我们用向下的方向键选中列表中的 textEdit。或者我们可以先输入 text,这时能缩减列表的内容。 8.如上图我们将鼠标放到 textEdit 上,这时便出现了 textEdit 的类名 信息, 且后面出现一个 F1 按键。 我们按下键盘上的 F1, 便能出现 textEdit 的帮助。9.我们在帮助中向下拉,会发现这里有一个 find 函数。10.我们点击 find,查看其详细说明。 11.可以看到 find 函数可以实现文本编辑器中字符串的查找。其中有一 个 FindFlags 的参数,我们点击它查看其说明。12.可以看到它是一个枚举变量(enum),有三个选项,第一项是向后查 找(即查找光标以前的内容,这里的前后是相对的说法,比如第一行已 经用完了,光标在第二行时,把第一行叫做向后。),第二项是区分大 小写查找,第三项是查找全部。 13.我们选用第一项,然后写出下面的语句。 ui-&textEdit-&find(findText,QTextDocument::FindBackward); //将行编辑器中的内容在文本编辑器中进行查找 当我们刚打出“f”时,就能自动弹出 textEdit 类的相关属性和方法。可以看到,当写完函数名和第一个“(”后,系统会自动显示出该函数的 函数原型,这样可以使我们减少出错。 14.这时已经能实现查找的功能了。但是我们刚才看到 find 的返回值类 型是 bool 型,而且,我们也应该为查找不到字符串作出提示。 if(!ui-&textEdit-&find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr(“查找”),tr(“找不到 %1″) .arg(findText); } 因为查找失败返回值是 false,所以 if 条件加了“!”号。在找不到时 弹出警告对话框。15.到这里, 查找功能就基本上写完了。 show_findText()函数的内容如下。 我们会发现随着程序功能的增强,其中的函数也会越来越多,我们都会 为查找某个函数的定义位置感到头疼。而在 Qt Creator 中有几种快速定 位函数的方法,我们这里讲解三种。 第一,在函数声明的地方直接跳转到函数定义的地方。 如在 do_file_Load 上点击鼠标右键, 在弹出的菜单中选择 Follow Symbol under Cursor 或者下面的 Switch between Method Declaration/Definition。这时系统就会自动跳转到函数定义的位置。如下图。第二,快速查找一个文件里的所有函数。 我们可以点击窗口最上面的下拉框, 这里会显示本文件中所有函数的列表。第三,利用查找功能。 1.我们先将鼠标定位到一个函数名上。2.然后选择 Edit-&Find/Replace-&Find Dialog。3.这时会出现一个查找对话框, 可以看到要查找的函数名已经写在里面了。4.当我们按下 Search 按钮后,会在查找结果窗口显示查找到的结果。 5.我们点击第二个文件。会发现在这个文件中有两处关键字是高亮显示。6.我们双击第二项,就会自动跳转到函数的定义处。文章讲到这里, 我们已经很详细地说明了怎样去使用一个类里面没有用过 的方法函数;也说明了 Qt Creator 中的一些便捷操作。可以看到,Qt Creator 开发环境,有很多很人性化的设计,我们应该熟练应用它们。 在以后的文章中,我们不会再很详细地去用帮助来说明一个 函数是怎么来的,该怎么用,这些应该自己试着去查找。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 八、Qt Creator 实现状态栏显示本文章原创于
转载请注明出处。 在程序主窗口 Mainwindow 中,有菜单栏,工具栏,中心部件和状态栏。 前面几个已经讲过了,这次讲解状态栏的使用。 程序中有哪些不明白的类或函数,请自己查看帮助。 1.我们在 mainwindow.h 中做一下更改。 加入头文件包含: #include &QLabel& 加入私有变量和函数: QLabel* first_statusL //声明两个标签对象,用于显示状态信息 QLabel* second_statusL void init_statusBar(); //初始化状态栏 加入一个槽函数声明:void do_cursorChanged(); //获取光标位置信息 2.在 mainwindow.cpp 中加入状态栏初始化函数的定义。 void MainWindow::init_statusBar() { QStatusBar* bar = ui-&statusB //获取状态栏 first_statusLabel = new QL //新建标签 first_statusLabel-&setMinimumSize(150,20); //设置标签最小尺寸 first_statusLabel-&setFrameShape(QFrame::WinPanel); //设置标签 形状 first_statusLabel-&setFrameShadow(QFrame::Sunken); //设置标签阴 影 second_statusLabel = new QL second_statusLabel-&setMinimumSize(150,20); second_statusLabel-&setFrameShape(QFrame::WinPanel); second_statusLabel-&setFrameShadow(QFrame::Sunken); bar-&addWidget(first_statusLabel); bar-&addWidget(second_statusLabel); first_statusLabel-&setText(tr(“欢迎使用文本编辑器”)); //初始 化内容 second_statusLabel-&setText(tr(“yafeilinux 制作!”)); } 这里将两个标签对象加入到了主窗口的状态栏里, 并设置了他们的外观和 初值。 3.在构造函数里调用状态栏初始化函数。 init_statusBar(); 这时运行程序,效果如下。4.在 mainwindow.cpp 中加入获取光标位置的函数的定义。 void MainWindow::do_cursorChanged() { int rowNum = ui-&textEdit-&document()-&blockCount(); //获取光标所在行的行号 const QTextCursor cursor = ui-&textEdit-&textCursor(); int colNum = cursor.columnNumber(); //获取光标所在列的列号 first_statusLabel-&setText(tr(“%1 行 %2 列”).arg(rowNum).arg(colNum)); //在状态栏显示光标位置 } 这个函数可获取文本编辑框中光标的位置,并显示在状态栏中。 5.在构造函数添加光标位置改变信号的关联。 connect(ui-&textEdit,SIGNAL(cursorPositionChanged()),this,SLOT( do_cursorChanged())); 这时运行程序。效果如下。6.在 do_file_Load 函数的最后添加下面语句。 second_statusLabel-&setText(tr(“打开文件成功”)); 7.在 saveFile 函数的最后添加以下语句。 second_statusLabel-&setText(tr(“保存文件成功”));8.在 on_action_Find_triggered 函数的后面添加如下语句。 second_statusLabel-&setText(tr(“正在进行查找”));9.在 on_action_Close_triggered 函数最后添加如下语句。 first_statusLabel-&setText(tr(“文本编辑器已关闭”)); second_statusLabel-&setText(tr(“yafeilinux 制作!”)); 最终的 mainwindow.cpp 文件内容如下。 最终的 mainwindow.h 文件如下。到这里整个文本编辑器的程序就算写完了。我们这里没有写帮助菜单的 功能实现,大家可以自己添加。而且程序中也有很多漏洞和不完善的地 方,如果有兴趣,大家也可以自己修改。因为时间和篇幅的原因,我们 这里就不再过多的讲述。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 九、Qt Creator 中鼠标键盘事件的处理实现自定 义鼠标指针本文章原创于
转载请注明出处。 我们前面一直在说信号,比方说用鼠标按了一下按钮,这样就会产生一个 按钮的单击信号,然后我们可以在相应的槽函数里进行相应功能的设置。 其实在按下鼠标后,程序要先接收到鼠标按下的事件,然后将这个事件按 默认的设置传给按钮。可以看出,事件和信号并不是一回事,事件比信号 更底层。而我们以前把单击按钮也叫做事件,这是不确切的,不过大家都 知道是什么意思,所以当时也没有细分。 Qt 中的事件可以在 QEvent 中查看。 下面我们只是找两个例子来进行简单 的演示。 1.还是先建立一个 Qt4 Gui Application 工程,我这里起名为 event。 2.添加代码,让程序中可以使用中文。 即在 main.cpp 文件中加入#include &QTextCodec&的头文件包含。 再在下面的主函数里添加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在 mainwindow.h 文件中做一下更改。 添加#include &QtGui&头文件。 因为这样就包含了 QtGui 中所有的子文件。 在 public 中添加两个函数的声明 void mouseMoveEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); 4.我们在 mainwindow.ui 中添加一个 Label 和一个 PushButton,将他们 拉长点,因为一会要在上面显示标语。 5.在 mainwindow.cpp 中的构造函数里添加两个部件的显示文本。 ui-&label-&setText(tr(“按下键盘上的 A 键试试!”)); ui-&pushButton-&setText(tr(“按下鼠标的一个键,然后移动鼠标试 试”)); 6.然后在下面进行两个函数的定义。 /*以下是鼠标移动事件*/ void MainWindow::mouseMoveEvent(QMouseEvent *m) {//这里的函数名和参数不能更改 QCursor my(QPixmap(“E:/Qt/Qt-Creator-Example/event/time.png”)); //为鼠标指针选择图片,注意这里如果用绝对路径,要用“/”,而不能 用“\” //也可以将图片放到工程文件夹得 debug 文件夹下,这样用相对路 径”time.png”就可以了 QApplication::setOverrideCursor(my); //将鼠标指针更改为自己设置的图片 int x = m-&pos().x(); int y = m-&pos().y(); //获取鼠标现在的位置坐标 ui-&pushButton-&setText(tr(“鼠标现在的坐标是(%1,%2), 哈哈好玩 吧”).arg(x).arg(y)); //将鼠标的位置坐标显示在按钮上 ui-&pushButton-&move(m-&pos()); //让按钮跟随鼠标移动 } /*以下是键盘按下事件*/ void MainWindow::keyPressEvent(QKeyEvent *k) { if(k-&key() == Qt::Key_A) //判断是否是 A 键按下 { ui-&label-&setPixmap(QPixmap(“E:/Qt/Qt-Creator-Example/event/l inux.jpg”)); ui-&label-&resize(100,100); //更改标签图片和大小 } } 注意:这两个函数不是自己新建的,而是对已有函数的重定义,所有函数 名和参数都不能改。第一个函数对鼠标移动事件进行了重写。其中实现了 鼠标指针的更改,和按钮跟随鼠标移动的功能。 第二个函数对键盘的 A 键按下实现了新的功能。 效果如下。 按下鼠标的一个键,并移动鼠标。按下键盘上的 A 键。分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 十、Qt Creator 中实现定时器和产生随机数本文章原创于
转载请注明出处。 有两种方法实现定时器。 第一种。自己建立关联。 1.新建 Gui 工程,工程名可以设置为 timer。并在主界面上添加一个标签 label,并设置其显示内容为“ 00:00:00 星期日”。 2.在 mainwindow.h 中添加槽函数声明。 private slots: void timerUpDate(); 3.在 mainwindow.cpp 中添加代码。 添加#include &QtCore&的头文件包含,这样就包含了 QtCore 下的所有文 件。 构造函数里添加代码: QTimer *timer = new QTimer(this); //新建定时器 connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定时器计满信号和相应的槽函数 timer-&start(1000); //定时器开始计时,其中 1000 表示 1000ms 即 1 秒 4.然后实现更新函数。 void MainWindow::timerUpDate() { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 QString str = time.toString(“yyyy-MM-dd hh:mm:ss dddd”); //设置系统时间显示格式 ui-&label-&setText(str); //在标签上显示时间 } 5.运行程序,效果如下。第二种。使用事件。(有点像单片机中的定时器啊) 1.新建工程。在窗口上添加两个标签。 2.在 main.cpp 中添加代码,实现中文显示。 #include &QTextCodec& QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在 mainwindow.h 中添加代码。 void timerEvent(QTimerEvent *); 4.在 mainwindow.cpp 中添加代码。 添加头文件#include &QtCore& 在构造函数里添加以下代码。 startTimer(1000); //其返回值为 1,即其 timerId 为 1 startTimer(5000);//其返回值为 2,即其 timerId 为 2 startTimer(10000); //其返回值为 3,即其 timerId 为 3添加了三个定时器,它们的 timerId 分别为 1,2,3。注意,第几个定时 器的返回值就为几。所以要注意定时器顺序。 在下面添加函数实现。 void MainWindow::timerEvent(QTimerEvent *t) //定时器事件 { switch(t-&timerId()) //判断定时器的句柄 { case 1 : ui-&label-&setText(tr(“每秒产生一个随机 数:%1″).arg(qrand()%10)); case 2 : ui-&label_2-&setText(tr(“5 秒后软件将关闭”)); case 3 : qApp-&quit(); //退出系统 } } 这里添加了三个定时器,并都在定时器事件中判断它们,然后执行相应的 功能。这样就不用每个定时器都写一个关联函数和槽函数了。 随机数的实现: 上面程序中的 qrand(),可以产生随机数,qrand()%10 可以产生 0-9 之间 的随机数。要想产生 100 以内的随机数就%100。以此类推。 但这样每次启动程序后,都按同一种顺序产生随机数。为了实现每次启动 程序产生不同的初始值。我们可以使用 qsrand(time(0));实现设置随机 数的初值,而程序每次启动时 time(0)返回的值都不同,这样就实现了产 生不同初始值的功能。 我们将 qsrand(time(0));一句加入构造函数里。 程序最终运行效果如下。分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: creator, qt, yafeilinux, 教程 十 一 、 Q T 2D 绘 图 ( 一 ) 绘 制 简 单 图 形本文章原创于
转载请注明出处。 说明:以后使用的环境为基于 Qt 4.6 的 Qt Creator 1.3.0 windows 版 本 本文介绍在窗口上绘制最简单的图形的方法。 1.新建 Qt4 Gui Application 工程,我这里使用的工程名为 painter01, 选用 QDialog 作为 Base class 2.在 dialog.h 文件中声明重绘事件函数 void paintEvent(QPaintEvent *); 3.在 dialog.cpp 中添加绘图类 QPainter 的头文件包含#include &QPainter& 4.在下面进行该函数的重定义。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,100); } 其中创建了 QPainter 类对象,它是用来进行绘制图形的,我们这里画了 一条线 Line,其中的参数为线的起点(0,0),和终点(100,100)。 这里的数值指的是像素, 详细的坐标设置我们以后再讲, 这里知道 (0, 0) 点指的是窗口的左上角即可。运行效果如下: 5.在 qt 的帮助里可以查看所有的绘制函数,而且下面还给出了相关的例 子。6.我们下面将几个知识点说明一下,帮助大家更快入门。 将函数改为如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP //画笔 pen.setColor(QColor(255,0,0)); QBrush brush(QColor(0,255,0,125)); //画刷 painter.setPen(pen); //添加画笔 painter.setBrush(brush); //添加画刷 painter.drawRect(100,100,200,200); //绘制矩形 } 这里的 pen 用来绘制边框,brush 用来进行封闭区域的填充,QColor 类用 来提供颜色, 我们这里使用了 rgb 方法来生成颜色,(red, 即 green, blue) , 它们取值分别是 0-255,例如(255,0,0)表示红色,而全 0 表示黑色, 全 255 表示白色。 后面的 (0, 255, 125) 其中的 125 是透明度 0, , (alpha) 设置,其值也是从 0 到 255,0 表示全透明。最后将画笔和画刷添加到 painter 绘制设备中,画出图形。这里的 Rect 是长方形,其中的参数为 (100,100)表示起始坐标,200,200 表示长和宽。效果如下:7.其实画笔和画刷也有很多设置,大家可以查看帮助。 QPainter painter(this); QPen pen(Qt::DotLine); QBrush brush(Qt::blue); brush.setStyle(Qt::HorPattern); painter.setPen(pen); painter.setBrush(brush); painter.drawRect(100,100,200,200); 这里我们设置了画笔的风格为点线,画刷的风格为并行横线,效果如下:在帮助里可以看到所有的风格。 我们这里用了 Qt::blue,Qt 自定义的几个颜色如下:8.画弧线,这是帮助里的一个例子。 QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形 int startAngle = 30 * 16; int spanAngle = 120 * 16; QPainter painter(this); painter.drawArc(rectangle, startAngle, spanAngle); 这里要说明的是,画弧线时,角度被分成了十六分之一,就是说,要想为 30 度,就得是 30*16。它有起始角度和跨度,还有位置矩形,要想画出自 己想要的弧线,就要有一定的几何知识了。这里就不再祥述。 //起始角度 //跨越度数 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程 十二、Qt 2D 绘图(二)渐变填充本文章原创于
转载请注明出处。 在 qt 中提供了三种渐变方式,分别是线性渐变,圆形渐变和圆锥渐变。 如果能熟练应用它们,就能设计出炫目的填充效果。 线性渐变: 1.更改函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QLinearGradient linearGradient(100,150,300,150); //从点(100,150)开始到点(300,150)结束,确定一条直线 linearGradient.setColorAt(0,Qt::red); linearGradient.setColorAt(0.2,Qt::black); linearGradient.setColorAt(0.4,Qt::yellow); linearGradient.setColorAt(0.6,Qt::white); linearGradient.setColorAt(0.8,Qt::green); linearGradient.setColorAt(1,Qt::blue); //将直线开始点设为 0,终点设为 1,然后分段设置颜色 painter.setBrush(linearGradient); painter.drawRect(100,100,200,100); //绘制矩形,线性渐变线正好在矩形的水平中心线上 } 效果如下: 圆形渐变: 1.更改函数内容如下: QRadialGradient radialGradient(200,100,100,200,100); //其中参数分别为圆形渐变的圆心(200,100),半径 100,和焦 点(200,100) //这里让焦点和圆心重合,从而形成从圆心向外渐变的效果 radialGradient.setColorAt(0,Qt::black); radialGradient.setColorAt(1,Qt::yellow); //渐变从焦点向整个圆进行,焦点为起始点 0,圆的边界为 1 QPainter painter(this); painter.setBrush(radialGradient); painter.drawEllipse(100,0,200,200); //绘制圆,让它正好和上面的圆形渐变的圆重合 效果如下:2.要想改变填充的效果,只需要改变焦点的位置和渐变的颜色位置即可。 改变焦点位置:QRadialGradient radialGradient(200,100,100,100,100); 效果如下: 锥形渐变: 1.更改函数内容如下: //圆锥渐变 QConicalGradient conicalGradient(50,50,0); //圆心为(50,50),开始角度为 0 conicalGradient.setColorAt(0,Qt::green); conicalGradient.setColorAt(1,Qt::white); //从圆心的 0 度角开始逆时针填充 QPainter painter(this); painter.setBrush(conicalGradient); painter.drawEllipse(0,0,100,100); 效果如下:2.可以更改开始角度,来改变填充效果 QConicalGradient conicalGradient(50,50,30); 开始角度设置为 30 度,效果如下: 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程 十三、Qt 2D 绘图(三)绘制文字本文章原创于
转载请注明出处。 接着上一次的教程,这次我们学习在窗体上绘制文字。 1.绘制最简单的文字。 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawText(100,100,”yafeilinux”); } 我们在(100,100)的位置显示了一行文字,效果如下。2.为了更好的控制字体的位置。我们使用另一个构造函数。在帮助里查 看 drawText,如下。这里我们看到了构造函数的原型和例子。 其中的 flags 参数可以控制字体 在矩形中的位置。我们更改函数内容如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QRectF ff(100,100,300,200); //设置一个矩形 painter.drawRect(ff); //为了更直观地看到字体的位置,我们绘制出这个矩形 painter.setPen(QColor(Qt::red)); //设置画笔颜色为红色 painter.drawText(ff,Qt::AlignHCenter,”yafeilinux”); //我们这里先让字体水平居中 } 效果如下。可以看到字符串是在最上面水平居中的。如果想让其在矩形正中间,我们 可以使用 Qt::AlignCenter。 这里我们也可以使用两个枚举变量进行按位与操作,例如可以使用 Qt::AlignBottom|Qt::AlignHCenter 实现让文字显示在矩形下面的正中 间。效果如下。 对于较长的字符串,我们也可以利用“\n”进行换行,例 如”yafei\nlinux”。效果如下。3.如果要使文字更美观,我们就需要使用 QFont 类来改变字体。先在帮 助中查看一下这个类。可以看到它有好几个枚举变量来设置字体。 下面的例子我们对主要的几个 选项进行演示。 更改函数如下。 void Dialog::paintEvent(QPaintEvent *) { QFont font(“Arial”,20,QFont::Bold,true); //设置字体的类型,大小,加粗,斜体 font.setUnderline(true); //设置下划线 font.setOverline(true); //设置上划线 font.setCapitalization(QFont::SmallCaps); //设置大小写 font.setLetterSpacing(QFont::AbsoluteSpacing,5); //设置间距 QPainter painter(this); painter.setFont(font); //添加字体 QRectF ff(100,100,300,200); painter.drawRect(ff); painter.setPen(QColor(Qt::red)); painter.drawText(ff,Qt::AlignCenter,”yafeilinux”); } 效果如下。这里的所有字体我们可以在设计器中进行查看。如下。分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程 十四、Qt 2D 绘图(四)绘制路径本文章原创于
转载请注明出处。 接着上一次的教程,这次我们学习在窗体上绘制路径。QPainterPath 这 个类很有用, 这里我们只是说明它最常使用的功能, 更深入的以后再讲。 1.我们更改 paintEvent 函数如下。 void Dialog::paintEvent(QPaintEvent *) { QPainterP path.addEllipse(100,100,50,50); path.lineTo(200,200); QPainter painter(this); painter.setPen(Qt::green); painter.setBrush(Qt::yellow); painter.drawPath(path); } 这里我们新建了一个 painterPath 对象,并加入了一个圆和一条线。然后 绘制这个路径。 效果如下。2.上面绘制圆和直线都有对应的函数啊,为什么还要加入一个 painterPath 呢? 我们再添加几行代码,你就会发现它的用途了。 void Dialog::paintEvent(QPaintEvent *) { QPainterP path.addEllipse(100,100,50,50); path.lineTo(200,200); QPainter painter(this); painter.setPen(Qt::green); painter.setBrush(Qt::yellow); painter.drawPath(path); QPainterPath path2; path2.addPath(path); path2.translate(100,0); painter.drawPath(path2); } 效果如下。这里我们又新建了一个 painterPath 对象 path2,并将以前的 path 添加 到它上面,然后我们更改了原点坐标为(100,0),这时你发现我们复制 了以前的图形。这也就是 painterPath 类最主要的用途,它能保存你已经 绘制好的图形。 3.这里我们应该注意的是绘制完一个图形后,当前的位置在哪里。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainterP path.lineTo(100,100); path.lineTo(200,100); QPainter painter(this); painter.drawPath(path); } 效果如下。可以看到默认是从原点(0,0)开始绘图的,当画完第一条直线后,当前 点应该在(100,100)处,然后画第二条直线。 再如: void Dialog::paintEvent(QPaintEvent *) { QPainterP path.addRect(50,50,40,40); path.lineTo(200,200); QPainter painter(this); painter.drawPath(path); } 效果如下。可见画完矩形后,当前点在矩形的左上角顶点,然后从这里开 始画直线。 我们可以自己改变当前点的位置。 void Dialog::paintEvent(QPaintEvent *) { QPainterP path.addRect(50,50,40,40); path.moveTo(100,100); path.lineTo(200,200); QPainter painter(this); painter.drawPath(path); } 效果如下图。可见 moveTo 函数可以改变当前点的位置。这里我们只讲解了绘制路径类最简单的应用,其实这个类很有用,利用 它可以设计出很多特效。有兴趣的朋友可以查看一下它的帮助。因为我 们这里只是简介,所以不再深入研究。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程
十五、Qt 2D 绘图(五)显示图片本文章原创于
转载请注明出处。 现在我们来实现在窗口上显示图片, 并学习怎样将图片进行平移, 缩放, 旋转和扭曲。这里我们是利用 QPixmap 类来实现图片显示的。 一、利用 QPixmap 显示图片。 1.将以前的工程文件夹进行复制备份,我们这里将工程文件夹改名为 painter05。(以前已经说过,经常备份工程目录,是个很好的习惯) 2.在工程文件夹的 debug 文件夹中新建文件夹,我这里命名为 images, 用来存放要用的图片。我这里放了一张 linux.jpg 的图片。如下图所示。3.在 Qt Creator 中打开工程。(即打开工程文件夹中的.pro 文件),如 图。 4.将 dialog.cpp 文件中的 paintEvent()函数更改如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP pix.load(“images/linux.jpg”); painter.drawPixmap(0,0,100,100,pix); } 这里新建 QPixmap 类对象,并为其添加图片,然后在以(0,0)点开始的 宽和高都为 100 的矩形中显示该图片。你可以改变矩形的大小,看一下效 果啊。最终程序运行效果如下。(说明:下面的操作都会和坐标有关,这里请先进行操作,我们在下一 节将会讲解坐标系统。) 二、利用更改坐标原点实现平移。 Qpainter 类中的 translate()函数实现坐标原点的改变,改变原点后,此 点将会成为新的原点(0,0); 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP pix.load(“images/linux.jpg”); painter.drawPixmap(0,0,100,100,pix); painter.translate(100,100); //将(100,100)设为坐标原点 painter.drawPixmap(0,0,100,100,pix); } 这里将(100,100)设置为了新的坐标原点,所以下面在(0,0)点贴图, 就相当于在以前的(100,100)点贴图。效果如下。三、实现图片的缩放。 我们可以使用 QPixmap 类中的 scaled()函数来实现图片的放大和缩小。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP pix.load(“images/linux.jpg”); painter.drawPixmap(0,0,100,100,pix); qreal width = pix.width(); //获得以前图片的宽和高 qreal height = pix.height(); pix = pix.scaled(width*2,height*2,Qt::KeepAspectRatio); //将图片的宽和高都扩大两倍,并且在给定的矩形内保持宽高的 比值 painter.drawPixmap(100,100,pix); } 其中参数 Qt::KeepAspectRatio,是图片缩放的方式。我们可以查看其帮 助。将鼠标指针放到该代码上,当出现 F1 提示时,按下 F1 键,这时就可 以查看其帮助了。当然我们也可以直接在帮助里查找该代码。这是个枚举变量,这里有三个值,只看其图片就可大致明白, Qt::IgnoreAspectRatio 是不保持图片的长宽比,Qt::KeepAspectRatio 是在给定的矩形中保持长宽比,最后一个也是保持长宽比,但可能超出给 定的矩形。这里给定的矩形是由我们显示图片时给定的参数决定的,例如 painter.drawPixmap(0,0,100,100,pix);就是在以(0,0)点为起始点的 宽和高都是 100 的矩形中。 程序运行效果如下。四、实现图片的旋转。 旋转使用的是 QPainter 类的 rotate()函数,它默认是以原点为中心进行 旋转的。我们要改变旋转的中心,可以使用前面讲到的 translate()函数 完成。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP pix.load(“images/linux.jpg”); painter.translate(50,50); //让图片的中心作为旋转的中心 painter.rotate(90); //顺时针旋转 90 度 painter.translate(-50,-50); //使原点复原 painter.drawPixmap(0,0,100,100,pix); } 这里必须先改变旋转中心,然后再旋转,然后再将原点复原,才能达到想 要的效果。 运行程序,效果如下。五、实现图片的扭曲。 实现图片的扭曲,是使用的 QPainter 类的 shear(qreal sh,qreal sv) 函数完成的。它有两个参数,前面的参数实现横行变形,后面的参数实现 纵向变形。当它们的值为 0 时,表示不扭曲。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QP pix.load(“images/linux.jpg”); painter.drawPixmap(0,0,100,100,pix); painter.shear(0.5,0); //横向扭曲 painter.drawPixmap(100,0,100,100,pix); } 效果如下:其他扭曲效果: painter.shear(0,0.5); //纵向扭 曲 painter.shear(0.5,0.5); //横纵扭曲 图片形状的变化,其实就是利用坐标系的变化来实现的。我们在下一节 中将会讲解坐标系统。这一节中的几个函数,我们可以在其帮助文件中 查看其详细解释。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程 十六、Qt 2D 绘图(六)坐标系统本文章原创于
转载请注明出处。 前面一节我们讲解了图片的显示,其中很多都用到了坐标的变化,这一 节我们简单讲一下 Qt 的坐标系统,其实也还是主要讲上一节的那几个函 数。这里我们先讲解一下 Qt 的坐标系,然后讲解那几个函数,它们分别 是: translate()函数, 进行平移变换; scale()函数, 进行比例变换; rotate() 函数,进行旋转变换;shear()函数,进行扭曲变换。 最后介绍两个有用的函数 save()和 restore(),利用它们来保存和弹出 坐标系的状态,从而实现快速利用几个变换来绘图。 一、坐标系简介。 Qt 中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然 后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上 依次减小。原点即为(0,0)点,然后以像素为单位增减。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::red); painter.drawRect(0,0,100,100); painter.setBrush(Qt::yellow); painter.drawRect(-50,-50,100,100); } 我们先在原点 (0, 绘制了一个长宽都是 100 像素的红色矩形, (-50, 0) 又在 -50)点绘制了一个同样大小的黄色矩形。可以看到,我们只能看到黄色 矩形的一部分。效果如下图。 二、坐标系变换。 坐标系变换是利用变换矩阵来进行的,我们可以利用 QTransform 类来设 置变换矩阵,因为一般我们不需要进行更改,所以这里不在涉及。下面我 们只是对坐标系的平移,缩放,旋转,扭曲等应用进行介绍。 1.利用 translate()函数进行平移变换。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,50,50); painter.translate(100,100); //将点(100,100)设为原点 painter.setBrush(Qt::red); painter.drawRect(0,0,50,50); painter.translate(-100,-100); painter.drawLine(0,0,20,20); } 效果如下。 这里将(100,100)点作为了原点,所以此时(100,100)就是(0,0) 点,以前的(0,0)点就是 (-100, -100) 要想使原来的 点。 (0, 点重新成为原点, 0) 就是将 (-100, -100)设为原点。 2.利用 scale()函数进行比例变换,实现缩放效果。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,100,100); painter.scale(2,2); //放大两倍 painter.setBrush(Qt::red); painter.drawRect(50,50,50,50); } 效果如下。可以看到, painter.scale(2,2), 是将横纵坐标都扩大了两倍, 现在的 (50, 50)点就相当于以前的 (100,100)点。 3.利用 shear()函数就行扭曲变换。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::yellow); painter.drawRect(0,0,50,50); painter.shear(0,1); //纵向扭曲变形 painter.setBrush(Qt::red); painter.drawRect(50,0,50,50); } 效果如下。这里,painter.shear(0,1),是对纵向进行扭曲,0 表示不扭曲,当将第 一个 0 更改时就会对横行进行扭曲,关于扭曲变换到底是什么效果,你观 察一下是很容易发现的。 4.利用 rotate()函数进行比例变换,实现缩放效果。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,0); painter.rotate(30); //以原点为中心,顺时针旋转 30 度 painter.drawLine(0,0,100,0); painter.translate(100,100); painter.rotate(30); painter.drawLine(0,0,100,0); } 效果如下。 因为默认的 rotate()函数是以原点为中心进行顺时针旋转的,所以我们 要想使其以其他点为中心进行旋转,就要先进行原点的变换。这里的 painter.translate(100,100)将(100,100)设置为新的原点,想让直线 以其为中心进行旋转,可是你已经发现效果并非如此。是什么原因呢?我 们添加一条语句,如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,0); painter.rotate(30); //以原点为中心,顺时针旋转 30 度 painter.drawLine(0,0,100,0); painter.rotate(-30); painter.translate(100,100); painter.rotate(30); painter.drawLine(0,0,100,0); } 效果如下。 这时就是我们想要的效果了。我们加的一句代码为 painter.rotate(-30), 这是因为前面已经将坐标旋转了 30 度,我们需要将其再旋转回去,才能 是以前正常的坐标系统。不光这个函数如此,这里介绍的这几个函数均如 此,所以很容易出错。下面我们将利用两个函数来很好的解决这个问题。 三、坐标系状态的保护。 我们可以先利用 save()函数来保存坐标系现在的状态,然后进行变换操 作,操作完之后,再用 restore()函数将以前的坐标系状态恢复,其实就 是一个入栈和出栈的操作。 例如: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.save(); //保存坐标系状态 painter.translate(100,100); painter.drawLine(0,0,50,50); painter.restore(); //恢复以前的坐标系状态 painter.drawLine(0,0,50,50); } 效果如下。利用好这两个函数,可以实现快速的坐标系切换,绘制出不同的图形。 分类:Qt 系列教程 作者: yafeilinux 日期: 四月 30th,
views Tags: 2D 绘图, creator, qt, yafeilinux, 教程
十 七 、 Q T 2D 绘 图 ( 七 ) Q T 坐 标 系 统 深 入本文章原创于
转载请注明出处。 接着上面一节,前面只是很简单的讲解了一下 Qt 坐标系统的概念,通过 对几个函数的应用, 我们应该已经对 Qt 的坐标系统有了一个模糊的认识。 那么现在就来让我们更深入地研究一下 Qt 窗口的坐标。希望大家把这一 节的例子亲手做一下,不要被我所说的东西搞晕了! 我们还是在以前的工程中进行操作。 获得坐标信息: 为了更清楚地获得坐标信息,我们这里利用鼠标事件,让鼠标点击左键时 输出该点的坐标信息。 1.在工程中的 dialog.h 文件中添加代码。 添加头文件: #include &QMouseEvent& 在 public 中添加函数声明:void mousePressEvent(QMouseEvent *); 然后到 dialog.cpp 文件中: 添加头文件: #include &QDebug& 定义函数: void Dialog::mousePressEvent(QMouseEvent *event) { qDebug() && event-&pos(); } 这里应用了 qDebug()函数,利用该函数可以在程序运行时将程序中的一 些信息输出,在 Qt Creator 中会将信息输出到其下面的 Application Output 窗口。这个函数很有用,在进行简单的程序调试时,都是利用该 函数进行的。我们这里利用它将鼠标指针的坐标值输出出来。 2.然后更改重绘事件函数。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawRect(0,0,50,50); } 我们绘制了一个左上顶点为(0,0),宽和高都是 50 的矩形。 3.这时运行程序。并在绘制的矩形左上顶点点击一下鼠标左键。效果如 下。(点击可看大图)因为鼠标点的不够准确,所以输出的是(1,0),我们可以认为左上角就 是原点 (0, 点。 0) 你可以再点击一下矩形的右下角, 它的坐标应该是 (50, 50)。这个方法掌握了以后,我们就开始研究这些坐标了。 研究放大后的坐标 1.我们现在进行放大操作,然后查看其坐标的变化。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.scale(2,2); } 我们将横纵坐标都扩大 2 倍,然后运行程序,查看效果: //横纵坐标都扩大 2 倍 painter.drawRect(0,0,50,50); 我们点击矩形右下顶点,是(100,100),比以前的(50,50)扩大了 2 倍。 研究 QPixmap 或 QImage 的坐标 对于 QWidget,QPixmap 或 QImage 等都是绘图设备,我们都可以在其上利 用 QPainter 进行绘图。现在我们研究一下 QPixmap 的坐标(QImage 与其 效果相同)。 1.我们更改重绘事件函数如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QPixmap pix(200,200); pix.fill(Qt::red); } 这里新建了一个宽、高都是 200 像素的 QPixmap 类对象,并将其背景颜色 设置为红色,然后从窗口的原点(0,0)点添加该 QPixmap 类对象。为了 表述方便,在下面我们将这个 QPixmap 类对象 pix 称为画布。 我们运行程序,并在画布的左上角和右下角分别点击一下,效果如下: //背景填充为红色 painter.drawPixmap(0,0,pix); 可以看到其左上角为(0,0)点,右下角为(200,200)点,是没有问题 的。 2.我们再将函数更改如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QPixmap pix(200,200); pix.fill(Qt::red); } 这时我们从窗口的(100,100)点添加该画布,那么此时我们再点击画布 的右上角,其坐标会是多少呢? //背景填充为红色 painter.drawPixmap(100,100,pix);可以看到,它是(100,100),没错,这是窗口上的坐标,那么这是不是 画布上的坐标呢? 3.我们接着更改函数。 void Dialog:

我要回帖

更多关于 黄金矿工中文版小游戏 的文章

 

随机推荐