数据结构课程设计-敢死队问题--------------艰难的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

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给