数据结构课程设计-敢死队问题--------------艰难的Qt入门之路

本文主要是介绍数据结构课程设计-敢死队问题--------------艰难的Qt入门之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

1 下载安装

我上网查安装教程,发现使用Qt Creator 适合新手,另外还有一个搭配就是Qt+Vs,考虑到自己是新手,并且Vs没有安装,一直使用的都是Dev-C++,于是我果断选择Qt Creator,上网找了好多安装教程,感觉乱乱的,于是问王**同学,她给我发过来一个5.8版本的安装包(独立于Vs)还有一本Qt入门的pdf版本的书籍,并教我如何配置环境变量以及如何查看是否配置成功。

配置环境变量

此电脑->属性->高级系统设置->环境变量->系统变量里的path双击点进去->把E:\Qt\5.8\mingw53_32\bin(这个是我存的地址,看你安装在哪里了)粘贴进去->确定。

检查是否配置成功

新建一个工程,直接运行,然后到相应的工程的文件夹中找到可执行文件,看是否能够运行。

 

2界面设计

我询问了一个用Qt做界面的同学,她的大致方向就是先设计好界面,再根据需求填充相应的代码。一开始我还是想要先看书,看了两章的样子,有点疲倦再开始找网上的视频看,看的是腾讯课堂里的一个录播,感觉讲的挺好的,就是老师有口音,加快看就听不清老师讲话了,就这样我一边看书一边看视频一边跟着操作稍微写了几个工程,跟着敲了一些代码。这样子过了一两天,有点不甘于这样了,于是我开始真正的新建GanSiDui Project,准备真正开始做界面了。

首先我先画了画大致的界面效果图,第一个是欢迎界面,这个要设计三个按钮①“系统说明”②“进入系统”③“退出系统”,点击①“系统说明”按钮,就会出现第二个界面:系统说明界面,此界面主要就是对敢死队的介绍,对本系统的介绍说明,点击②“进入系统”按钮,就会出现第三个系界面:敢死队系统的主界面,此界面大方向两个功能,输入选择的数据结构方法、n、m之后,一是直接输出要求的start的值,二是通过动态演示,演示内容是从一号开始计数,不断删除,直到只剩一人,根据这人的编号计算出start值。

Qt的一些基本知识

Qt Creator提供的默认基类只有QMainWindow、QWidget和QDialog这3种。QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而它们全部继承自QWidget,不仅如此,其实所有的窗口部件都继承自QWidget。

按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:

模态对话框:对话框弹出来,但是MyWidget窗口还没有弹出来,关闭对话框,MyWidget窗口才弹出来。即,在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,调用exec()函数。 非模态对话框:既可以与它交互,也可以与同一程序中的其它窗口交互,可用new操作来创建,然后使用show()函数来显示。

多窗口切换

Qt中使用信号和槽机制来完成对象之间的协调操作。简单来说,信号和槽都是函数,比如单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽关联起来,在这个槽中创建一个对话框并且显示它。这样,单击这个按钮时就会发射信号,进而执行槽来显示对话框。

例如“系统说明”按钮,点击会出现系统说明的界面,不讲需要在头文件中添加函数声明,在cpp文件中添加函数方法以及connect函数,说一种比较简单的方式,在它的ui界面中,选中按钮,右键点击,列表点击“转到槽…”,然后就会直接给你转到一个函数里面,然后直接添加当你点击这个按钮时,你希望出现的效果的代码即可,比如我这里需要另外一个界面show()出来。

从欢迎界面到主界面也是应用信号和槽,首先是 欢迎界面.cpp中的相关代码

然后是main.cpp相关代码

 

这样就可以实现子窗口与主窗口的切换。

退出系统

这个超级简单,比如欢迎界面的退出系统按钮,在它的ui界面,在上面一行中,(快捷键F4)选中第二个“信号和槽模式” ,在“退出系统”按钮上按住鼠标左键,然后随意拖动到当前窗口的任意处界面上(出现一个红色箭头即可),这时松开鼠标左键,在弹出的配置连接对话框中,按照下图中所示的选择来选择,

然后点击ok按钮,这样子就可以啦。按F3退出“信号和槽模式”(我的电脑需要按Fn+F3)。

Label标签内容太长

在我的“系统说明”界面,我是用的Label控件,当我直接把内容复制到它的text时,显示出来只有一行,只要加“\n”即可换行显示。

设置窗口的名字

this->setWindowTitle("敢死队问题登录界面");

设置控件提示框

ui->pushButton_3->setToolTip("什么是敢死队问题?点击就知道!");

输入输出控件

同学建议我用lineEdit控件,于是我就用了,后来我觉得输出搞一个不一样的吧,后来看Qt教程视频的时候,偶然老师一句lcdNumber挺好看的,于是主界面的输出我就选择了这个控件,效果不错,布局用了好几个水平布局,动态演示那块用的是gridlayout布局,这个是室友建议我用的。

设置字体样式和大小

ui->label->setFont(QFont("Microsoft YaHei", 15, QFont::Normal));

关于按钮上的字我都如上设置,因为我觉得微软雅思字体比较好看颜色又比较深,比较有辨识度。

将按钮设置成圆角按钮

https://blog.csdn.net/wxl1986622/article/details/8725205

Qt中使用stylesheet方式将按钮设置成圆角按钮,代码如下

setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;");

如pushButton如下用法:

pushButton->setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;");

备注:我设置了,但没有太大变化,可能是我的整体背景太粉嫩了,不容易看出来。

背景图片设置、pushButton背景图片设置

首先添加资源文件,步骤如下

No.1添加资源文件,右键项目,添加新文件-〉Qt Resource File-〉命名,如下图:

No.2添加完成后在工程目录中会出现相对应的资源qrc文件,右键选择用资源管理器打开,先添加前缀,前缀可自行设置,后选择要添加的图形文件,图形文件一般放在相应工程文件夹中,可新建images文件夹并将所有工程所需图片放至文件夹。

关于背景图片设置,查了好多,仅一个深得我意,比较简单,只需要在ui界面中操作,那就是选中你准备修改背景的控件,无论是整个界面的背景还是某一个控件的背景,右键点击->改变样式表->添加资源右边的倒三角->选中border-image->选择你想要的作为背景的图片->ok按钮!(选中border-image是能够适应控件的大小的,而background-image是固定的大小,可能不会是你理想中的效果。)

另外,你可能会发现,你的主界面依然不是你设置的那个,因为主界面还需要一些代码,在main.cpp中加上下面的代码,就可以显示了,但是不是适应屏幕的,由于看着界面还不错,我也就没有查这是为什么。

背景颜色的设置

比如:bn[i]->setStyleSheet("background: rgb(64,224,208)");//按钮背景设置为绿色

各种颜色RGB值

见如下的博客

https://blog.csdn.net/suifenghahahaha/article/details/80259300

3数据传输

输入的数字传到程序中 

输入的传到程序中事先定义的字符串变量,然后将字符串变量转为数字(QT中将QString转化为int型)。

把程序得到的结果输出到lcdNumeber控件上

定义的start_option函数,主要是通过选择,实现六种数据结构方法并返回start的值,

通过display()实现将结果显示到控件上。

4动态演示

在室友的提醒下,主要是先拿一个控件作为容器,再把一种控件作为人,放在容器里,因为我感觉这个题目是已知结果求条件,所以不太好直观地表示出求start的过程,于是我打算演示的是从1号开始计数,逐渐删除战士,直到只剩下一个,动态演示只能演示到这里,接下来,后台还需要自己根据最后剩下的这个编号计算出start值,然后再传入到另一个lcdNumber控件。

于是我选择gridlayout作为容器,然后定义一个button数组,因为地方有限,所以暂时最多定义20个pushButton,当然我个人感觉这没有什么问题,一支敢死队一般是不会超过20人的。

类似sleep等待的方法

很多时候,为了让整个动态演示更清晰,我们需要在某些地方,让程序停顿一秒,以便我们更清晰的看到整个问题的解决过程。代码如下:

 

#include <QCoreApplication>

void waitSec(int s)

{

    QTime t;

    t.start();

    while(t.elapsed()<1000*s)

        QCoreApplication::processEvents();

}

 

在需要停顿的地方加上代码:waitSec(1);即可

备注:按理说sleep(1)是可以的,然而我的程序运行时就会crashed,于是抛弃之。

QT中将int转化为QString型

int a = 1;

label->setText(QString::number(a));

或者

QString a = "1";

label->setText(a);

我的敢死队的动态演示的设计

点击start按钮,开始动态演示;

首先将三个输入的值传入,当然这里主要是n和m值,因为不论选择哪一种数据结构,我都只用这一种动态演示方法,根据n值,定义了n个pushButton,为了与整个背景的粉色形成视觉冲击,于是将每一个按钮背景色设置成柔和的绿色,注意还需要向gridLayout容器中装pushButton(ui->gridLayout->addWidget(bn[i], 0, i););

下面的while循环就是前面实现数组方法的改编版,在其基础上加的内容是:每次要删除的那个元素的背景色先变为紫色,然后其后面元素前移,移完最后剩的元素值设为“0”,然后紫色恢复为绿色,直到最后只剩下一个非0值bn[0],然后根据这个bn[0]值,计算出start的值,这里要注意的就是将QString型变为int型!

这篇关于数据结构课程设计-敢死队问题--------------艰难的Qt入门之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726969

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)