使用对话框和Qt设计师来实现一个相当简单的小游戏。同时将通过这个程序来看布局的隐藏和显示是如何来影响窗口界面的变化的。

新建一个Qt项目,把Qt Creator默认给的mainwindow.h、mainwindow.cpp、mainwindow.ui三个文件删除掉,这里我们只创建一个对话框。虽然也会创建出类似的这3个文件。

先来设计一下界面,在Qt设计师中新建一个【Dialog without Buttons】。

我放入这几个部件:

各个部件对象的名称:

在GuessNumberDialog对象,也就是整个对话框,它的【windowTitle】属性,也就是标题,就是【猜数字】。

在Qt设计师中在部件中使用中文,不需要担心会出现乱码,至少我还是没有遇到过的。

其它部件的属性没怎么改动,有的话也就是他们的名称了。

对于QSpinBox和QcomboBox的对象,在写代码中会去改一下它的属性。

在【最大值】和【最小值】标签,后面有个很奇怪的东西,"&M"和"&N"是什么?其实我是想让这2个标签拥有快捷键的功能。但是,一般来讲,给标签设置快捷键似乎也没什么用处吧,因为他们一般是不可编辑不可按的,不像编辑框、按钮那样。

在2.1创建对话框那一篇文章里曾经在一个标签部件上使用过一个函数,setBuddy。这个函数的参数是另一个部件……

所以在Qt设计师中,要使标签具有快捷键功能,并且能够通过这个快捷键定位到另外一个部件上去,除了在这个标签上写上"&M"或"&N",还需要再一个步骤。

点击工具栏的【编辑伙伴】按钮。

此时鼠标可以移动到【最大值】标签上,左键按住,然后鼠标移动到要相关联的部件上,自然是移到【maxValueSpinBox】这个微调框部件上了。

成功后,你就会惊讶地发现,"&M"变成了"M",也就是变身快捷键了。

同理,【最小值】标签也可以这样子做。

设置完成【伙伴】之后,点击工具栏的【编辑窗口部件】按钮。回到编辑的编辑状态。

现在来对这些部件做布局。

左键点击【输入数字范围】这个群组框部件,会将它选中:

然后点击工具栏的【栅格布局】图标。

你将看到,【输入数字范围】群组框部件里面的部件已经自动排列。

但是,排列之后,"开始游戏"的位置比较奇怪。

上一节也是有提过的,栅格布局相当于QGridLayout,就是相当于把各个部件放在一个表格的不同单元格中一样。可能比较好理解吧……一个部件可以连续占多个单元格,不管是横还是竖方向上的占用。

我们需要对部件摆放成一个大致的布局,我可以把"开始游戏"按钮在栅格布局之后,重新调整它的大小。

不过这个按钮似乎有些长了,看着感觉怪怪的,我想把它放在中间该怎么做呢?

可以使用一个起到"占位符"作用的部件:【Spacers】

它可以将"多余"的空间全部占用,使得部件都能够调整成最佳的大小,而不需要将部件再调整它的大小去占用多余空间,有损"美观"。

要将已经布局好的一组部件打破,只需要点击一下这个布局内的任一一处,然后点击工具栏上的【打破布局】按钮。

打破布局之后,我们在"开始游戏"按钮左边和右边都加上【Horizontal Spacer】。

然后再次使用栅格布局。

不过这样会增大部件占用的空间。

同理,【猜数字】群组框部件也可以同样使用栅格布局。

最后,单击对话框内的空白地方,再按【栅格布局】按钮。

然后再点击【调整大小】按钮。

将对话框调整到最佳的大小。

到此,这个界面就做完了。保存这个文件。

在Qt Creator中新建一个项目。

右键【项目名称】,点击【添加新文件】,选择【C++ Class】,写上类名,然后就完成创建。我创建的类叫【GameDialog】。

将ui文件添加到这个项目中。

在【gamedialog.h】中,代码如下:

头文件基本就没什么要说明的了。

然后是源文件,先看构造函数:

第6、7行:设置QString和tr()函数的字符显示编码。设置了UTF-8之后,中文就能够正常显示了。

第12行:重新调整对话框的大小。将猜数字群组框隐藏之后,窗口大小还不会随之自动改变,可以自己手动调用adjustSize来调整窗口大小到最佳状态。

用到的函数:void QWidget::adjustSize ()

函数的说明:调整部件的大小以适应其内容。在例子中,部件是指整个对话框。

第14行:将部件的信号和槽的连接全部定义在一个函数中,比较方面查看。

play()函数,如果点击了"开始游戏"按钮,则调用这个槽函数:

第20行:检测最大值和最小值的有效性。

第25行:qrand()函数是一个随机数函数,差不多相当于rand()函数吧。设置一个最小值和最大值范围内的随机数。

第27行:设置组合框中的选项。

selectNumber()函数,当组合框当前索引值发生改变之后,就会调用这个槽函数:

第40行:组合框的索引从0开始,而0是"请选择数字"这一选项,所以如果当前索引是0,则直接返回。

第43行:断开信号和槽的连接,这可以防止在initComboBox()函数重新设置选项时而触发了组合框当前索引改变的信号。

第47行:检测值,如果与m_num这个值相同,就猜对了,否则猜错了。

第59行:tr()函数,它是一个将字符串内的文本翻译成其他语言的标记,可以用于具有多语言版本的程序中。

只要程序中有其它语言的翻译文件,就可以将当前字符串内的文本显示成其它语言的翻译版本。这个是随便自己的咯,也可以不用加tr()函数。而是直接一个字符串。翻译文件在以后也会说的。

tr()函数返回的是QString类型。QString中有一个arg()函数。它用于将QString字符串里的"%1"这个符号替换成arg()函数中的数值。"%1"相当于是一个占位符,与printf()函数中的"%d、%s、%f"等占位符相同道理。

arg()函数返回的是字符串第一个"%n"被替换之后的QString类型字符串。

如果需要替换多个,可以使用"%n",然后后面再加上n个arg()函数。

例如:

用到的函数:QString QString::arg ( const QString & a, int
fieldWidth = 0, const QChar & fillChar = QLatin1Char( ' ' ) ) const

函数的说明:返回此字符串的副本,用字符串a来替换一个数值最小的位置标记,位置标记如:%1,%2,……,%99。

当然,arg()函数有多个函数重载版本,支持不同类型变量数值来替换字符串。

第72行:猜错之后,最大值或者最小值将重新设置。组合框的选项也将重新设置。

initConnect()函数和initComboBox()函数:

第94行:在添加完选项之后,将当前选择设置到索引为0的项。也就是"请选择数字"。

第96行:连接信号和槽,当组合框的当前索引发生改变时,调用GameDialog类中的selectNumber()槽。

checkValid()函数和checkValue()函数:

都是好理解的2个函数。

最后,main.cpp中的代码:

这就不需要再做说明咯。

运行结果:

OK,基本就是这样子~~~

【Qt】2.4 做一个“猜数字”的游戏的更多相关文章

  1. python新手如何编写一个猜数字小游戏

    此文章只针对新手,希望大家勿喷,感谢!话不多说先上代码: import random if __name__ == '__main__': yourname = input("你好! 你的名 ...

  2. Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例

    1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...

  3. python开发_tkinter_自己做的猜数字小程序

    读到这篇文章[python 3.3下结合tkinter做的猜数字程序]的时候,就复制了代码,在自己机器上面跑了一下 源程序存在一个缺陷: 即当用户答对了以后,用户再点击'猜'按钮,最上面的提示标签还会 ...

  4. java猜数字小游戏

    /* * * 猜数字小游戏 * * 先由系统生成一个2-100之间的随机数字, * * 然后捕获用户从控制台中输入的数字是否与系统生成的随机数字相同, * * 如果相同则统计用户所猜的次数,并给出相应 ...

  5. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  6. Python基础入门-实现猜数字小游戏

    今天呢,我们来通过前面学过的一些知识点来完成一个猜数字大小的游戏程序设计.那么呢,一般人写代码直接上来就干,没有分析,这样的做法是没有产出的,除非你是大牛,今天呢,我会把我学习编程的思路分享给大家,我 ...

  7. [Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  8. 简单的猜数字小游戏--Python

    猜数字小游戏: #coding=utf-8 import random   answer =random.randint(1,100) #生成随机数 n=int (input("Please ...

  9. JavaScript一个猜数字游戏

    效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载 ...

随机推荐

  1. 关于android中线性布局的layout_gravity属性

    当 android:orientation="vertical"  时, 只有水平方向的设置才起作用,垂直方向的设置不起作用.即:left,right,center_horizon ...

  2. jQuery Mobile Data 属性

    按钮 带有 data-role="button" 的超链接.button 元素.工具栏中的链接以及 input 字段都会自动渲染成按钮样式,不需要添加 data-role=&quo ...

  3. JS - Constructor还可以这样用

    JS中Constructor好用法: 即在只知道一个对象实例的情况下(不知道对象名),重新初始化一个新实例: function Person( firstname, lastname, age ) { ...

  4. 使用jQuery开发一个带有密码强度检验的超酷注册页面

    在今天的jQuery教程中,我们将介绍如何使用jQuery和其它相关的插件来生成一个漂亮的带有密码强度检验的注册页面,希望大家喜欢! 相关的插件和类库 complexify - 一个密码强度检验jQu ...

  5. 魔兽争霸3 replay 格式

    ******************************************************************************* * WarCraft III Repla ...

  6. crontab 定时调度

    crontab -e */1 8-23 * * * /www/target/sh/myorder.sh & 0 1 * * * /www/target/php/sh/mymoney.sh &a ...

  7. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  8. 二十一、【.Net开源框架】EFW框架Web前端开发之目录结构和使用FireBug调试方法

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu. ...

  9. p2p研究

    p2p网络结构 中央集中式结构 无集中式非结构 混合式以超级节点结构 穿透原理 防火墙为克隆型(cone net),对称型(Symmetric NAT) 只有克隆型才能用打洞方式穿透 开源方案 htt ...

  10. [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence

    一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...