写在前面:如果我曾经说过要在第一周之内写完大作业,那……肯定是你听错了。不过如果我在写的时候有攻略看的话应该可以轻松地在4~5天内做完,然后觉得写攻略的人是个小天使吧(疯狂暗示)。出于给大家自由发挥的考虑,本文略去了很多细节,如果按照本攻略行进过程中遇到任何问题请尽可能告知我,一来相互提供新的思路,二来能帮助我完善攻略。

  因为担心今天不写出来的话明天可能会忘(其实是担心托更太久没人愿意看),虽然搬宿舍弄得比较晚还是先稍微来写点东西。(最后结果是写这段话之后又拖了一天

  这个二感觉有点划水,只是介绍一下我写代码的工作打算从哪里展开。咦这两天我就想出来这个,我到底在干什么啊。

1. 画饼

  大佬们貌似写代码之前会把整个代码的框架整理出来,这种整体先思考好的做法应该是非常值得提倡的,但是,对于我们这种连起步怎么做都没有思路的小白来说是非常困难的吧。因此,我的建议是先把能想出来要建的类写一写,数据、函数能想到多少找多少,然后找一条线索往下做,在做的过程中慢慢丰富之前写的类

  具体来说,我先建了User类和Task类,内容瞎写,能想到什么成员、函数先写着,有一个框架回头慢慢加东西就行了。然后我们可以从跟用户最贴近的界面开始做,依次绘制主界面、个人界面、任务详情界面等等内容,当你在界面中写下了一个输入框或者按钮之类涉及跟后台的交互的控件时,你就知道自己User类、Task类里需要记录哪些数据,需要跟外界有什么样的交互。

  

  之后所有与Qt相关的内容我都是现学现卖,结构也感觉非常乱,如果有不正确的地方求轻喷指正。

  我单独开了一篇随笔更新我当前的代码结构,如果你想被剧透(或者大作业做不完了)可以稍微参考一下:

  https://www.cnblogs.com/Enceladus/p/11216384.html

2. 主界面

  把主界面单独拿出来作为一个范例让大家知道整个具体的开发过程是什么样的,后面其他界面估计都会一笔带过。

  

  写在前面

    对Qt框架的一些理解:Qt的主要结构大约是树状的,你可以把界面进行划分,比如说我窗口分为上下两半,分别用另一个对象(一般是用QWidget)来填充这个区域,每个区域中又可以放入按钮、文本框之类的控件。这两个对象就是这个窗口的子元素,具体的小控件又是这两个对象的子元素。通过这样一层一层地划分和填充,最终堆砌起来整个画面。

    基本上对于各种常用的控件库里面都有提供,有任何需求的话可以直接在搜索引擎中输入“Qt 按钮”、“Qt QPushButton”,之类的进行学习,或者开一个临时文件,在Designer中设计之后观察ui_****.h中它的相关代码是怎么写出来的。如果足够巨可以在VS中按Ctrl点击一个类的名称查看这个类的声明,从中直接查看相关方法。

    关于如何在VS中输出Qt的调试信息,在项目->属性->链接器->系统->子系统修改为下拉菜单中的控制台(SUBSYSTEM:CONSOLE)即可,这样一来我们直接printf,qDebug输出的东西就会出现在控制台里面了。

    另外,我们暂时不考虑美观方面的问题,等造出来一个能work的版本再来统一进行美化。

  由于在我自己的电脑上Qt Designer设计出来的效果总是跟实际有区别(也许是我不会用),所以这里使用的主要是纯代码编辑来描绘窗口,当然不排除以后可能用Designer进行辅助。

  首先我们新建一个Qt GUI Application项目作为我们此次大作业的最终项目,建完会发现VS已经帮你建立好了一个QMainWindow从继承过来的类。

  来了解一下这个QMainWindow,它是基础布局元素QWidget的一个派生,它已经预设好了一个布局(如图,图片来自网络),里面有菜单栏、工具栏、状态栏、主画面等等,我们的思路是所有页面都直接以此为基础,仅仅改变主界面中的内容即可。

  

  a. Menu

  新建一个类,命名为Menu,从QMenuBar那里继承过来。不使用原生的QMenuBar是因为我们可能需要给它加一些行为,甚至多一些数据成员,如果真有需要那时会方便一些。(其实是想强行体现继承关系

  在VS中加类有很方便的操作,直接在项目下拉菜单中找到Add Qt Class,类型我暂时都选了GUI,这样以后如果想通过UI设计布局会方便一些。后面唯一需要修改的设置是把Base Class设置为QMenuBar。

  

  之后可以直接用QMenuBar的addAction("A")函数在菜单栏中添加一个文字为A的元素,因为我们的Menu类是从QmenuBar继承过来的所以它也有相应的函数。

  如果你希望这个元素拥有更加丰富的属性,比如自定义样式或者交互函数,可以new一个QAction出来,然后自己进行设定,再add进去。

  如果你还希望这个菜单栏拥有下拉菜单,下拉菜单还有有再一层展开的菜单,可以用QMenu类,new QMenu之后addAction就跟前面一样是直接加一个元素,addMenu函数就可以将另一个QMenu类型的元素加进去变成多层菜单。

  MainWindow中有一个setMenuBar的函数,可以将一个QMenuBar型的函数加进我们的主界面里,样式方面都帮我们预设好了(一开始我还想着把窗口当成一个画布疯狂手绘-_-||)。

  这里是一份测试代码,完整的VS工程文件已经放在网盘的example文件夹下:

    https://cloud.tsinghua.edu.cn/d/059ef6b1f9a149ce879b/files/?p=/example/Menu.rar

  大家可以自行尝试,代码中有涉及信号与槽,以后我们会讲(我自己现在也没弄明白= =)。

  

  

  b. Content、Index

  打算用一个Content类表示页面的主要内容,之后由它来派生出Index、TaskList、LogIn之类具体界面的类,它就放在界面Central Widget,这部分没什么难度。

  我们需要关心的是界面的具体设计,现在我们需要设计的是主页(叫Index是造网站留下来的习惯)。在已经有Menu的情况下,主页的设计相对简单,摆一个大大的标题出来,写点简介即可(嘛,反正我造网站的时候是这么做的,顺路打个广告:www.enceladus.cf)。

  写index时遇到的一个坑:元素只有在show()之后才能获得正确的width()和height()。一开始我把index设置成centralWidget,然后放在里面的Label设置大小的时候设置为这个index的宽,也就是充满画面,挣扎了很久发现获得的宽并不是正确的宽。

  所以我建议在考虑样式相关内容的时候还是尽可能用qss来进行设置。另外遇事不决加layout,这的确是一个非常重要的布局工具。

  具体来说,这个index我的做法是在index下建一个QVBoxLayout,也就是竖直的布局,然后分别用QLabel和QTextBrowser实现标题和介绍,再add进layout里,另外在add的时候额外加参数可以调整大小比例。

  c. Status

  具体如何在程序中加入QStatusBar就不说了,跟前面基本上是一样的。

  connect(信号发出者, SIGNAL(信号函数), 信号接收者, SLOT(接收者槽函数));

  信号函数一般是内置好的,如triggered,clicked,需要时查一下即可。

  槽函数是信号接收者类中的函数,自己定义,想干什么都可以。因此如果信号发出者和接受者是父子元素关系的话,一般我们会把这个connect放在父亲那里,因为父亲可以很容易得到指向儿子的指针,儿子却比较难拿到指向父亲的,不是父子关系可能需要放在它们的lca(最近公共祖先)那里?

  实现了一下单击Menu中的元素就在Status中showMessage,之后可以修改为页面的切换。showMessage加字符串可以在状态栏显示这个字符串,可以再加一个整数表示显示的毫秒时间。

  主界面最终效果:

  

c++小学期大作业攻略(二)整体思路+主界面的更多相关文章

  1. c++小学期大作业攻略(一)环境配置

    UPDATE at 2019/07/20 20:21 更新了Qt连接mysql的方法,但是是自己仿照连VS的方法摸索出来的,简单测试了一下能work但是不保证后期不会出问题.如果你在尝试过程中出现了任 ...

  2. c++小学期大作业攻略(五)基于QSS的样式美化

    这回真的是最后一篇了. 前面说过,我们开发过程中暂时不搭理样式问题,等最后再一起处理,那么现在就是最后处理时刻了!看到网上说QSS跟CSS差不多,我还觉得自己可以干回老本行了,结果用起来发现,QSS是 ...

  3. c++小学期大作业攻略(三)用户系统

    Update at 2019/07/22 14:16 发现一个大坑,我们后期是打算用QSS统一堆样式进行美化的,于是我把之前对QLabel进行的setAlignment全部去掉了,打算统一丢进Qss里 ...

  4. c++小学期大作业攻略(零)建议+代码结构(持续更新)

    当前已经做好的exe,数据库是连服务器的,但是头像是存在本地的文件系统里面: https://cloud.tsinghua.edu.cn/d/059ef6b1f9a149ce879b/files/?p ...

  5. c++小学期大作业攻略(四)任务系统+站内信

    虽然比最早的预定晚了整整一个星期但这核心功能最后一篇终于还是来了. 如果你已经经历了用户系统的洗礼,相信代码实现应该已经没有太大的难度,所以我们重点关注一下设计好的流程. 一.任务系统 首先是新建任务 ...

  6. (NO.00004)iOS实现打砖块游戏(二):实现游戏主界面动画

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个内容不错的游戏也要一个好的包装.玩家进入游戏时第一眼看到的是 ...

  7. 内连接、左外连接、右外连接、全外连接、交叉连接(CROSS JOIN)-----小知识解决大数据攻略

    早就听说了内连接与外连接,以前视图中使用过.这次自考也学习了,只是简单理解,现在深入探究学习(由于上篇博客的出现)与实践: 概念 关键字: 左右连接 数据表的连接有: 1.内连接(自然连接): 只有两 ...

  8. mac攻略(二) -- 简单配置php开发环境

    最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP.   1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...

  9. react hooks 全面转换攻略(二) react本篇剩余 api

    useCallback,useMemo 因为这两个 api 的作用是一样的,所以我放在一起讲; 语法: function useMemo<T>(factory: () => T, d ...

随机推荐

  1. Anchor 和 Dock 属性的使用

    Anchor 是一个常用属性,用来控制当窗体大小变化,控件如何自动调整自身大小和位置 一 仅设置一个值 如果此时将窗体放大,将会变成这样: 由于固定了top, 所以top不变,那么bottom自然会因 ...

  2. Vue计算属性computed的全面解析

    前言 一直以来对computed这个计算属性都只停在一个大概的认知中,最近特意仔细研读相关资料,亲测后逐渐了解了其特性. 正文 computed 特点: 1.初始化/依赖属性(即data属性)改变时执 ...

  3. 几种高效的Java工具类推荐

    本文将介绍了十二种常用的.高效的Java工具类 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 在开发中,使用这些工具类,不仅可以提高编码效率,还 ...

  4. 对于不返回任何键列信息的 SelectCommand,不支持 DeleteCommand 的动态 SQL 生成

    VS新增操作数据库出现如下报错. 原因是数据库表未添加主键 MySQL: CREATE TABLE Customer (SID integer, Last_Name ), First_Name ), ...

  5. pandas 之 datetime 初识

    import numpy as np import pandas as pd 认识 Time series data is an impotant from of data in many diffe ...

  6. 关于SQLite数据库 字段 DateTime 类型

    这两天刚接触SQLite 数据库 还没有太过于深入的了解 , 于是出现了一个问题 : 我在 C#中 ,使用SQLiteHelper 查询SQLite数据库数据时,报了这个错误: System.Form ...

  7. 解决在linux下编译32程序出现“/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录问题”

    centos64位编译32位代码,出现/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录,需要安装32位的glibc库文件. 安装 ...

  8. FastDfs的搭建

    一.什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用Fast ...

  9. Django项目中出现的错误及解决办法(ValueError: Dependency on app with no migrations: customuser)

    写项目的时候遇到了类似的问题,其实就是没有生成迁移文件,执行一下数据库迁移命令就好了 ValueError: Dependency on app with no migrations: customu ...

  10. Vue.js如何获得兄弟元素,子元素,父元素(DOM操作)

    我不是代码的生产者,我只是知识的搬运工. 戳这