c++小学期大作业攻略(一)环境配置
UPDATE
at 2020/04/21 14:19
心疼九字班
at 2019/07/20 20:21
更新了Qt连接mysql的方法,但是是自己仿照连VS的方法摸索出来的,简单测试了一下能work但是不保证后期不会出问题。如果你在尝试过程中出现了任何问题请务必告知我。
at 2019/07/19 13:43
如果你安装Qt的时候忘记安装相应的包,是可以补充安装的,参考:https://blog.csdn.net/lzp_k2/article/details/83178585
自己测试了一下,会提示需要先更新,就先update之后再add or remove。整个过程中偶尔会提示辅助工具太老,这时貌似不管它就可以了(手动捂脸。
这个部分我就不在正文里详细写了,有啥问题私戳我趴(企图勾搭
at 2019/07/18 11:58
考虑到用户密码的部分可能需要用到MD5(其实是因为想凑字数),文末补充了Openssl的安装方法。
at 2019/07/18 11:58
Qt中如果你希望双击exe能够直接打开并正常运行程序,需要在环境变量PATH中加入msvc2017_64\bin(具体见下)。
添加了Qt完成配置后测试用代码的来源。
at 2019/07/17 11:10
后面正式开发的时候需要整合Qt和MySQL,建议直接在VS中新建Qt项目,它会帮你配置好Qt相关的内容,然后再手动配置MySQL的库。
众所周知,我们的c++小学期大作业是实现一个众包平台,要求体现面向对象,有图像界面(虽然说可以没有但是肯定分不高啊),有数据库(虽然说可以用文件系统但是肯定分不高啊)。这么大一个工程要我们三周时间内做出来实在是非常难以想象……于是萌生了趁早开始搞,把做大作业的过程中踩过的坑分享给大家,顺便收割一波访问量给完全没思路的同学一点前进的方向的想法。我不会公开自己的核心代码,原则上也不会阐述具体细节,只谈大的轮廓,或者大家应该自学的方向(不然我怕被老师查水表可能剥夺了同学们的学习机会)。
我自己的思路是VS2017+Qt+MySQL,如果你完全不知道怎么搞可以按照我的来,大佬们有自己的思路我就当作是提供一点借鉴吧。
今日份是Part 1,关于如何配置相关环境,还有一些前置知识的学习,因为是零碎的环境配置所以会比较细节一点,以后不会了。与其说是攻略更多是把网上的资料汇总起来……
先放一个链接,里面是需要下载的一些软件安装包:https://cloud.tsinghua.edu.cn/d/059ef6b1f9a149ce879b/
用的是清华云盘,不烧流量,反正估计也没办法服务外校同学。
1. VS2017
选择VS2017是因为自己电脑已经装好了,而且用起来也比2012舒服一些,有自动调代码风格的功能(对范老师代码风格要求宝具?)。如果你用的是其他版本应该也可以照常进行,不过不能保证就是了。云盘里已经放了一个vs_2017_installer.zip,这个安装起来应该没有难度,有啥问题可以私戳我鸭。
2. Qt
我也是一个头一次接触Qt的小白,所以就以一个小白的视角来安装了。
参考链接:https://blog.csdn.net/qq_38906523/article/details/76503551
官方下载链接:https://download.qt.io/archive/qt
我用的是qt-opensource-windows-x86-5.13.0.exe,同样在云盘里有。
安装包打开之后一路next、skip就行了(但我还是注册了个账号登上了,好像不搞也没事)
安装部分,MinGW和MSVC 2017是两个编译器,建议都装上有问题可以换,如果想在VS里面写代码MSVC就必装,其他东西不太了解大致勾了一些有可能需要用到的,反正多装点东西总好过回头出错。安装的过程比较漫长,这段时间你可以用来先装一下MySQL。
安装完成我们先不急连接VS,作为一个小白还是先用自带IDE了解一下Qt的一些基础比较好。
参考教程(Manual什么的对咱小白来说太高级了啦):
http://www.kuqin.com/qtdocument/tutorial.html
后一个教程似乎用的版本比较老,直接把代码拿下来不一定跑得动,不过它的解释还是很清楚的,用来了解一下Qt的大致工作方式还是挺好的。
IDE的具体使用第一份教材已经说得很详细了,稍微说一下咱的理解。
Qt似乎可以分为纯代码编辑和Qt Designer协助开发两种方式。打开UI文件的话会发现它的编码跟HTML代码很像(不知道HTML是啥也没关系,因为很像也没什么用)。
纯代码编辑的话就相当于将Qt的库加载进程序里面,然后我们需要在cpp文件中创建各种各样的小零件,设计好它们的大小、位置和其他样式,确定父子元素关系,堆砌在屏幕上,这部分可以直接参考第二个教程。
UI的话就是图形化设计了。对于在窗口上触发的点击、键盘按钮按下之类的事件则是通过信号与槽机制实现的。另外Qt中还有qss这样一个美化样式的文件,不过暂时可以不管它,后面觉得界面丑再慢慢加上好了。总体来说跟Web开发还是挺像的。
然后来看一下如何在VS2017中使用Qt。
在VS中找到工具->扩展和更新->联机,搜索Qt然后安装它的一个辅助工具。
这时需要退出VS重启,VS会提示安装Qt的辅助工具,再次打开VS看到一个Qt VS Tools,选择其下拉菜单中的Qt Options,将之前安装的Qt的安装路径Add进去
这个时候就已经配置完成了,我们可以在VS中新建Qt的项目或者直接在代码中加载Qt的库进行操作。
该部分代码来自:https://blog.csdn.net/xuexiaokkk/article/details/53487278(直接新建项目然后贴进main.cpp里面就可以了)
虽然这个图像界面简陋而且十分复古但还是让人看到了完成大作业的希望!
如果你希望打开exe文件能直接运行程序,还需要配置一下环境变量。最简单的方法是win+Q在搜索框中直接输入“环境变量”,在用户和系统环境变量中都可以找到一个叫PATH的,随便哪个都可以,在其中加入Qt的msvc2017_64\bin即可。搞定之后双击exe即可弹出程序感觉就跟真的在做开发一样^_^。
如果设置完环境变量发现不行,也可以直接从MySQL那里拿libeay32.dll, libmysql.dll, ssleay32.dll放到exe同目录下。
3. MySQL
不知道选择MySQL算不算比较low的选择,但由于博主有过使用MySQL的Web开发经验所以选择了这个东西,对于此次大作业我们应该只需要学会连接数据库,新建数据表,在数据表中插入or删除数据以及查询数据即可,都可以用相对简单的语句实现。
参考资料:https://blog.csdn.net/qq_35987486/article/details/84066304
SQL教程:http://www.w3school.com.cn/sql/index.asp
先从安装开始,云盘中提供了mysql-installer-community-8.0.13.0.msi, 打开后同样是一路next和execute就行。中途如果提示你没有安装VS和Python3.7无法进行连接的话其实不用管它(我明明安装了python3.7啊可它就是没检测出来),不过我还是在云盘中提供了python3.7的安装包。
到这个地方的话需要输入数据库的密码,默认用户名是root,密码得记好(还用你说)
这里是输入数据库的服务名,最好写个能记住的名字,我一开始还以为是数据库名就写了个translation......
成功打开后会是下面这个界面,至于自动打开的shell先不管它,那个太高级了。
点这个加号新建连接,双击连接输密码进入数据库,然后我们可能需要先来新建一个给众包平台用的数据库。
建完数据库可以在右下角看到它,展开之后就可以做新建数据表之类的操作
后面肯定是需要建很多张表的,作为测试我们先来新建一张记录用户的表,随便起个名字之后点右边的奇怪箭头就可以开始设计这张表的结构了。
MySQL的数据表跟Excel差不多,由行和列组成,每一列代表一种信息,每一行代表一个数据(这里每一行就是一个用户),
大致设计一下这个表需要的数据,有用户的id,Nickname(这里我打算用Nickname作为登录的唯一标识),其他个人信息、语言资质证明、积分等。需要提一下这些数据的类型,VARCHAR表示是字符串,INT和TINYINT都是表示整数,后面的数字是显示宽度,反正大概这么写就行了,具体的暂时不用理解太多。勾选的东西PK表示这个元素是这张表的主键,也就是主要的脉络。NN是Not Null,不能是空的。UQ表示不能重复。AI表示这个元素会自增,就是塞数据的时候不给它数据它就自己++。Default是默认值,这里将score设置为默认0。其他的可以参考给的资料,说得很详细了。
做好确认之后它会给你反馈一下原始的SQL语句。我们刚刚做的设计都是在UI上进行的,之后实际操作还是应该尽可能用SQL语句来实现,我们需要用到的SQL语法也并不多,可以在W3school上看,其实用到不会写再查就行,非常简单。
数据表建完就可以做插入、查询之类的操作,根据查到的语法我们可以七七八八地拼凑出下面这样的语句,就是插入一行数据,查询而已。
具体来说,我们可以查到查询的语句是“SELECT 列名称 FROM 表名称”,插入的语句是“INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)”,然后照猫画虎就可以实现基本的需求了。
这样一来我们就大概了解了SQL的语法,可以开始考虑连接VS和MySQL了。
如果你是按照我所说的方法安装,大概率是装上了64位的MySQL(不知道为啥没有弹出来让我选32位还是64位)。在VS中新建一个空项目,把参考资料中大佬给出来的代码贴上去,改一改然后咱们来看看能不能跑。观察这份代码,可以发现我们需要先写好连接MySQL的相关设置,然后使用mysql.h中给的函数直接进行连接,查询等操作。如果你希望自己的代码鲁棒性好一些还可以加入出错时的提示。
下面是测试用代码
#include <stdio.h> #include <stdlib.h> #include<Windows.h> #include<mysql.h> #pragma comment(lib, "libmysql.lib") int main(void) { MYSQL mysql, *sock; //声明MySQL的句柄 const char * host = "127.0.0.1"; //因为是作为本机测试,所以填写的是本地IP const char * user = "root"; //这里改为你的用户名,即连接MySQL的用户名 const char * passwd = "Z001221z"; //这里改为你的用户密码 const char * db = "student"; //这里改为你要连接的数据库的名字,一个数据可能有几张表 unsigned int port = 3306; //这是MySQL的服务器的端口,如果你没有修改过的话就是3306。 const char * unix_socket = NULL; //unix_socket这是unix下的,我在Windows下,所以就把它设置为NULL unsigned long client_flag = 0; //这个参数一般为0 const char * i_query = "select * from srt"; //查询语句,从那个表中查询,这里后面没有; MYSQL_RES * result; //保存结果集的 MYSQL_ROW row; //代表的是结果集中的一行 //my_ulonglong row; mysql_init(&mysql); //连接之前必须使用这个函数来初始化 if ((sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag)) == NULL) //连接MySQL { printf("fail to connect mysql \n"); fprintf(stderr, " %s\n", mysql_error(&mysql)); exit(1); } else { fprintf(stderr, "connect ok!!\n"); } if (mysql_query(&mysql, i_query) != 0) //如果连接成功,则开始查询 .成功返回0 { fprintf(stderr, "fail to query!\n"); exit(1); } else { if ((result = mysql_store_result(&mysql)) == NULL) //保存查询的结果 { fprintf(stderr, "fail to store result!\n"); exit(1); } else { while ((row = mysql_fetch_row(result)) != NULL) //读取结果集中的数据,返回的是下一行。因为保存结果集时,当前的游标在第一行【之前】 { printf("id is %s\t", row[0]); //打印当前行的第一列的数据 printf("name is %s\t\n", row[1]); //打印当前行的第二列的数据 printf("sex is %s\t\n", row[2]); //row = mysql_num_row(result); //printf("%lu\n", mysql_num_row(result)); } } } mysql_free_result(result); //释放结果集 mysql_close(sock); //关闭连接 system("pause"); exit(EXIT_SUCCESS); } --------------------- 作者:ZHAOMANGANG 来源:CSDN 原文:https://blog.csdn.net/qq_35987486/article/details/84066304 版权声明:本文为博主原创文章,转载请附上博文链接!
需要配置的东西如下:
将VS的编译选项改为Debug、x64。
然后在项目->属性->c++->常规->附加包含目录中加上MySQL的include目录,在链接器->常规->附加库目录中加上lib目录,偷懒起见我两个都写上了C:\Program Files\MySQL\MySQL Server 8.0\include;C:\Program Files\MySQL\MySQL Server 8.0\lib,需要根据自己安装MySQL的位置进行修改。
还需要在链接器->输入->附加依赖项中加入libmysql.lib,不过这句话跟代码里的#pragma comment(lib, "libmysql.lib")是一样的。
走到这里已经可以编译了,但是运行会提示缺少libmysql.dll,挣扎了很久发现,将MySQL Server 8.0\bin下的libeay32.dll和MySQL Server 8.0\lib下的libmysql.dll一起放在文件目录中的Debug文件夹下(有exe在的那个debug)就可以正常运行了。或者这一步也可以直接通过把bin和lib文件夹的路径加入PATH环境变量来解决,方法在Qt中已经演示过了。
4. 整合
大概写一个程序让它能同时使用Qt和MySQL,这样前置工作就完成了。建议是先在VS中打开Qt项目,然后再手动配置MySQL。
把上面写过的两行代码拼起来他就work了^_^
5. OpenSSL
因为有可能在处理用户密码的时候使用到就写在这了。
云盘中已经上传OpenSSL的安装包。解压后把include目录和lib目录像装MySQL的时候一样加进项目属性里即可,链接器->输入 里需要加入libssl.lib;libcrypto.lib;
6. Qt连MySQL
自己仿照连VS的方法摸索出来的,没有用Qt自己的Sql驱动,简单测试了一下能work但是不保证后期不会出问题。
由于MySQL默认设置的路径有空格,我们需要换个路径。将MySQL的MySQL Server 8.0目录copy出来,同时起一个没有空格的名字。
新建一个工程,在.pro文件末尾加上这段东西:
INCLUDEPATH += "C:\tmp\MYSQL\include" LIBS += "C:\tmp\MYSQL\lib\libmysql.lib"
具体include和libmysql.lib需要修改为你自己的路径,但是注意不要包含空格,最好也别有中文吧。
测试用到的代码,直接贴进main.cpp就可以了:
#include "mainwindow.h" #include <QApplication> #include <mysql.h> #include <cstdio> #include <qpushbutton> #include<qfont> #include <QVBoxLayout> char S[100]; int main(int argc, char *argv[]) { MYSQL mysql, *sock; //声明MySQL的句柄 const char * host = "127.0.0.1"; //因为是作为本机测试,所以填写的是本地IP const char * user = "root"; //这里改为你的用户名,即连接MySQL的用户名 const char * passwd = "*****"; //这里改为你的用户密码 const char * db = "translation"; //这里改为你要连接的数据库的名字,一个数据可能有几张表 unsigned int port = 3306; //这是MySQL的服务器的端口,如果你没有修改过的话就是3306。 const char * unix_socket = nullptr; //unix_socket这是unix下的,我在Windows下,所以就把它设置为NULL unsigned long client_flag = 0; //这个参数一般为0 const char * i_query = "select ID, Nickname, score from users"; //查询语句,从那个表中查询,这里后面没有; MYSQL_RES * result; //保存结果集的 MYSQL_ROW row; //代表的是结果集中的一行 //my_ulonglong row; mysql_init(&mysql); //连接之前必须使用这个函数来初始化 if ((sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag)) == nullptr) //连接MySQL { printf("fail to connect mysql \n"); fprintf(stderr, " %s\n", mysql_error(&mysql)); exit(1); } else { fprintf(stderr, "connect ok!!\n"); } if (mysql_query(&mysql, i_query) != 0) //如果连接成功,则开始查询 .成功返回0 { fprintf(stderr, "fail to query!\n"); exit(1); } else { if ((result = mysql_store_result(&mysql)) == NULL) //保存查询的结果 { fprintf(stderr, "fail to store result!\n"); exit(1); } else { while ((row = mysql_fetch_row(result)) != NULL) //读取结果集中的数据,返回的是下一行。因为保存结果集时,当前的游标在第一行【之前】 { printf("ID is %s\n", row[0]); //打印当前行的第一列的数据 printf("Nickname is %s\n", row[1]); //打印当前行的第二列的数据 printf("score is %s\n", row[2]); sprintf_s(S, "==%s==", row[1]); //row = mysql_num_row(result); //printf("%lu\n", mysql_num_row(result)); } } } QApplication a(argc, argv); QWidget window; window.resize(200,120); QVBoxLayout layout; QPushButton quit(S,&window); quit.setFont(QFont("Times",18,QFont::Bold)); QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit())); layout.addWidget(&quit); window.setLayout(&layout); window.show(); return a.exec(); }
当然账号密码,查询语句需要改改,我自己是user的数据表里有一个Nickname为swm_sxt,ID为1的数据。
这里先编译一下,会显示程序异常退出,然后把bin下的libeay32.dll和lib目录下libmysql.dll拷贝到刚刚生成的一个奇怪名字文件夹(应该是跟项目文件夹同目录)下的Debug目录(总之跟你提示程序异常退出的时候显示的exe在同个目录下)
再运行,就成功了。
仅供参考,我瞎弄出来的,不保证正确性,但既然简单的查询语句能成功对于大作业来说应该是可以满足需求了?
完结撒花!明天开始正式码代码!