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在同個目錄下)
再運行,就成功了。
僅供參考,我瞎弄出來的,不保證正確性,但既然簡單的查詢語句能成功對於大作業來說應該是可以滿足需求了?
完結撒花!明天開始正式碼代碼!