




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第12章PyQt6實(shí)現(xiàn)“援心”心理測(cè)試系統(tǒng)實(shí)戰(zhàn)需求分析數(shù)據(jù)庫(kù)設(shè)計(jì)PyQt6GUI界面設(shè)計(jì)系統(tǒng)總體設(shè)計(jì)系統(tǒng)詳細(xì)設(shè)計(jì)PyInstaller打包程序熟悉項(xiàng)目的設(shè)計(jì)流程掌握面向?qū)ο蟪绦蛟O(shè)計(jì)方法熟悉PyQt6模塊中控件的基本使用方法熟悉SQLite數(shù)據(jù)庫(kù)的基本使用方法12.1需求分析12.1需求分析“援心”是一款心理測(cè)試系統(tǒng),學(xué)生在系統(tǒng)中進(jìn)行抑郁癥自測(cè),了解自己的心理狀態(tài),如果測(cè)試結(jié)果是有抑郁傾向的,則可以選擇心理教師進(jìn)行輔導(dǎo)。心理教師對(duì)選擇自己的學(xué)生進(jìn)行心理輔導(dǎo),并提出咨詢建議。打開(kāi)系統(tǒng)時(shí),出現(xiàn)登錄界面,用戶通過(guò)用戶名和密碼進(jìn)行登錄。如果用戶是管理員,則進(jìn)入用戶管理界面,管理員可以對(duì)系統(tǒng)中的用戶進(jìn)行管理,添加、編輯或者刪除用戶。如果用戶是學(xué)生,則進(jìn)入心理自測(cè)界面,學(xué)生可以進(jìn)行心理測(cè)試,選擇心理輔導(dǎo)教師,查看自己已測(cè)的記錄,還可以修改密碼。如果用戶是教師,則進(jìn)入心理輔導(dǎo)界面,可以對(duì)選擇自己的學(xué)生進(jìn)行心理輔導(dǎo),填寫咨詢建議,也可以修改密碼。12.1需求分析系統(tǒng)的功能列表12.2數(shù)據(jù)庫(kù)設(shè)計(jì)SQLite數(shù)據(jù)庫(kù)簡(jiǎn)介SQLite數(shù)據(jù)庫(kù)的基本語(yǔ)法SQLite數(shù)據(jù)庫(kù)的基本操作項(xiàng)目數(shù)據(jù)庫(kù)設(shè)計(jì)使用Python操作SQLite數(shù)據(jù)庫(kù)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.1SQLite數(shù)據(jù)庫(kù)簡(jiǎn)介數(shù)據(jù)庫(kù)是長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)有組織、可共享的大量數(shù)據(jù)的集合,關(guān)系型數(shù)據(jù)庫(kù)包括SQLite、MicrosoftAccess、MYSQL等,非關(guān)系型數(shù)據(jù)庫(kù)(一般指NoSQL)包括Redis、AmazonDynamoDB等。其中SQLite是輕量級(jí)、基于磁盤文件的數(shù)據(jù)庫(kù)管理系統(tǒng),它無(wú)需在系統(tǒng)中進(jìn)行配置,自給自足,不需要任何外部的依賴,而且每個(gè)數(shù)據(jù)庫(kù)完全存儲(chǔ)在單個(gè)跨平臺(tái)的磁盤文件中。由于SQLite的以上特點(diǎn),本項(xiàng)目選用它進(jìn)行數(shù)據(jù)管理。12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.1SQLite數(shù)據(jù)庫(kù)簡(jiǎn)介數(shù)據(jù)庫(kù)的可視化展示會(huì)運(yùn)用數(shù)據(jù)庫(kù)管理工具Navicat。使用Navicat創(chuàng)建一個(gè)SQLite數(shù)據(jù)庫(kù)mental_test.db。12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.2SQLite數(shù)據(jù)庫(kù)的基本語(yǔ)法SQLite數(shù)據(jù)庫(kù)中的語(yǔ)句不區(qū)分大小寫,GLOB和glob除外,因?yàn)樗鼈冇胁煌暮x。SQLite數(shù)據(jù)庫(kù)的單行注釋以“--”為標(biāo)志,多行注釋以“/*”開(kāi)始,以“*/”為終止,語(yǔ)句之間以英文分號(hào)“;”作為結(jié)束標(biāo)志。存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)中的值,可以分為5個(gè)存儲(chǔ)類。存儲(chǔ)類說(shuō)明NULL存儲(chǔ)一個(gè)NULL值INTEGER存儲(chǔ)一個(gè)帶符號(hào)的整數(shù)REAL存儲(chǔ)一個(gè)浮點(diǎn)值TEXT存儲(chǔ)一個(gè)文本字符串,編碼格式為UTF-8、UTF-16BE或UTF-16LEBLOB存儲(chǔ)一個(gè)blob數(shù)據(jù),根據(jù)它的輸入進(jìn)行存儲(chǔ)SQLite中沒(méi)有單獨(dú)存儲(chǔ)日期或者時(shí)間的存儲(chǔ)類,可以將日期和時(shí)間存儲(chǔ)為TEXT類型,存儲(chǔ)格式為“YYYY-MM-DDHH:MM:SS.SSS”12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-創(chuàng)建表CREATETABLEdatabase_name.table_name( column1datatypePRIMARYKEY(oneormorecolumns), column2datatype, column3datatype, ..... columnNdatatype,);通過(guò)CREATETABLE語(yǔ)句可以創(chuàng)建表database_name為數(shù)據(jù)庫(kù)名稱,如果已經(jīng)指定了,則可以省略。table_name表示新表的名稱,columnN表示列名,datatype表示數(shù)據(jù)類型,PRIMARYKEY表示主鍵,唯一表示數(shù)據(jù)庫(kù)表中的每條記錄,其所約束的列中的值必須唯一且不能為NULL。12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-創(chuàng)建表創(chuàng)建一個(gè)用戶表user,包含列id(用戶名)、password(密碼)、role(角色),其中id作為主鍵。CREATETABLEuser( idTEXTPRIMARYKEYNOTNULL, passwordTEXT, roleTEXT);12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-刪除表通過(guò)DROPTABLE可以刪除表DROPTABLEdatabase_name.table_name刪除user表DROPTABLEIFEXISTS"user";實(shí)際刪除表的時(shí)候,需要加上IFEXISTS判斷,如果表存在則刪除,不加此判斷的話,表不存在時(shí)刪除表會(huì)報(bào)錯(cuò)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-添加數(shù)據(jù)通過(guò)INSERTINTO語(yǔ)句可以向數(shù)據(jù)庫(kù)中的表中添加新的數(shù)據(jù)行INSERTINTOuser(id,password,role)VALUES("202201","202201","學(xué)生");INSERTINTOuser(id,password,role)VALUES("tea202201","tea202201","教師");INSERTINTOtable_name(column1,column2,column3,...columnN)VALUES(value1,value2,value3,...valueN);12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)通過(guò)SELECT語(yǔ)句可以從數(shù)據(jù)庫(kù)的表中獲取數(shù)據(jù),以結(jié)果表的形式返回?cái)?shù)據(jù)。SELECT語(yǔ)句的查詢有多種形式,以下將介紹:?jiǎn)伪聿樵儣l件查詢多表查詢模糊查詢12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)-單表查詢單表查詢的基本語(yǔ)法格式如下。SELECTcolumn1,column2,...columnNFROMtable_name;columnN是指table_name表的字段獲取表中所有的字段SELECT*FROMtable_name;12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)-單表查詢查詢user表中id和password字段SELECTid,passwordFROMuser;12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)-條件查詢條件查詢需要使用WHERE子句SELECTcolumn1,column2,...columnNFROMtable_nameWHERE[condition];SELECT*FROMuserWHEREid="202201";查詢user表中id為202201的數(shù)據(jù)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)-多表查詢?cè)O(shè)計(jì)一個(gè)teacher表,表中有字段工號(hào)id和姓名name,假設(shè)教師的用戶名就是教師的工號(hào)現(xiàn)希望查詢出工號(hào)為tea202201的教師的工號(hào)、姓名和密碼,其中密碼需要teacher表和user表兩表查詢,從user表中取出教師密碼。SELECTteacher.id,name,passwordFROMuser,teacherWHEREteacher.id=user.idANDteacher.id="tea202201";12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-查詢數(shù)據(jù)-模糊查詢模糊查詢需要使用LIKE子句SELECTcolumn_listFROMtable_nameWHEREcolumnLIKE[condition];SELECT*FROMuserWHEREidLIKE"%2022%";查詢user表中id含有2022的數(shù)據(jù)LIKE子句后的條件由“%”和“_”運(yùn)算符組成,“內(nèi)容%”表示以“內(nèi)容”開(kāi)頭,“%內(nèi)容”表示以“內(nèi)容”結(jié)尾,“%內(nèi)容%”表示任意位置含有“內(nèi)容”,“_”運(yùn)算符則表示占位符,代表單一的數(shù)字或字符。12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-修改數(shù)據(jù)通過(guò)UPDATE語(yǔ)句可以修改表中已有的數(shù)據(jù)UPDATEtable_nameSETcolumn1=value1,column2=value2....,...columnN=valueNWHERE[condition];UPDATEuserSETpassword="123456"WHEREid="202201";將user表中用戶名為202201的數(shù)據(jù)中的密碼修改為12345612.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-刪除數(shù)據(jù)通過(guò)DELETE語(yǔ)句可以刪除表中已有的數(shù)據(jù)DELETEFROMtable_nameWHERE[condition];DELETEFROMuserWHEREid="tea202201";刪除user表中用戶名為tea202201的數(shù)據(jù)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-排列數(shù)據(jù)通過(guò)ORDERBY子句可以基于一個(gè)列或多個(gè)列按照升序或者降序順序排列表中數(shù)據(jù)SELECTcolumn-listFROMtable_name[WHEREcondition][ORDERBYcolumn1,column2,...columnN][ASC|DESC];12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.3SQLite數(shù)據(jù)庫(kù)的基本操作-排列數(shù)據(jù)設(shè)計(jì)一個(gè)學(xué)生考勤記錄表record,記錄學(xué)生的學(xué)號(hào)(student_id)、姓名(student_name)、簽到時(shí)間(time)將record表中的數(shù)據(jù)按照time字段從近到遠(yuǎn)進(jìn)行排序SELECT*FROMrecordORDERBYtimeDESC12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.4項(xiàng)目數(shù)據(jù)庫(kù)設(shè)計(jì)數(shù)據(jù)表字段字段類型說(shuō)明option(選項(xiàng)表)option_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號(hào)question_idINTEGER題目編號(hào)detailTEXT選項(xiàng)內(nèi)容scoreINTEGER選項(xiàng)對(duì)應(yīng)分值record(記錄表)record_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號(hào)student_idTEXT學(xué)生學(xué)號(hào)teacher_idTEXT教師工號(hào)questionaire_idINTEGER問(wèn)卷編號(hào)mental_scoreINTEGER心理測(cè)試分?jǐn)?shù)mental_resultTEXT心理測(cè)試結(jié)果test_timeTEXT心理測(cè)試時(shí)間is_counselTEXT是否已輔導(dǎo)suggestionTEXT咨詢建議counsel_timeTEXT咨詢時(shí)間數(shù)據(jù)表字段字段類型說(shuō)明user(用戶表)idTEXTPRIMARYKEY用戶名passwordTEXT密碼roleTEXT角色,老師或者學(xué)生student(學(xué)生表)idTEXTPRIMARYKEY學(xué)號(hào)nameTEXT姓名gradeTEXT年級(jí)classTEXT班級(jí)sexTEXT性別teacher(教師表)idTEXTPRIMARYKEY工號(hào)nameTEXT姓名sexTEXT性別questionaire(問(wèn)卷表)idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號(hào)nameTEXT問(wèn)卷名稱questions(題目表)question_idINTEGERPRIMARYKEYAUTOINCREMENT唯一編號(hào)questionaire_idINTEGER問(wèn)卷編號(hào)numberINTEGER題目序號(hào)titleTEXT題目?jī)?nèi)容表中的數(shù)據(jù)相互關(guān)聯(lián),user表需要內(nèi)置管理員數(shù)據(jù)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.4項(xiàng)目數(shù)據(jù)庫(kù)設(shè)計(jì)心理測(cè)試問(wèn)卷需要先內(nèi)置在數(shù)據(jù)庫(kù)中,本項(xiàng)目中采用抑郁癥量表進(jìn)行測(cè)試questionaire表questions表option表的部分內(nèi)容12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)在Python中可以直接操作SQLite數(shù)據(jù)庫(kù),需要導(dǎo)入sqlite3庫(kù)importsqlite3下面將會(huì)介紹:連接數(shù)據(jù)庫(kù)Connection對(duì)象Cursor對(duì)象操作數(shù)據(jù)庫(kù)的總體流程12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)-連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)需要使用connect()方法sqlite3.connect(database)connect()方法用于連接一個(gè)SQLite數(shù)據(jù)庫(kù)文件database,如果給定的數(shù)據(jù)庫(kù)文件database不存在,則會(huì)新建一個(gè)數(shù)據(jù)庫(kù)。如果不希望在當(dāng)前目錄中創(chuàng)建數(shù)據(jù)庫(kù),則可以指定帶有路徑的文件名,在任意位置創(chuàng)建數(shù)據(jù)庫(kù)。connect()方法連接數(shù)據(jù)庫(kù)后會(huì)返回一個(gè)Connection對(duì)象。12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)-Connection對(duì)象Connection類是sqlite3模塊中的最重要的類之一方法說(shuō)明cursor()返回連接的游標(biāo),即Cursor對(duì)象commit()提交當(dāng)前事務(wù),不提交則自上一次調(diào)用commit()以來(lái)所做的任何動(dòng)作都不會(huì)保存到數(shù)據(jù)庫(kù)中close()關(guān)閉數(shù)據(jù)庫(kù)連接12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)-Cursor對(duì)象Cursor類也是sqlite3模塊中的最重要的類之一方法說(shuō)明execute(sql[,parameters])執(zhí)行一條SQL語(yǔ)句,該SQL語(yǔ)句可以參數(shù)化,sqlite3模塊支持兩種類型的占位符,問(wèn)號(hào)和命名占位符,例如:cursor.execute('select*fromuserwhereid=?',(id,))executemany(sql,seq_of_parameters)對(duì)seq_of_parameters中的所有參數(shù)或映射執(zhí)行一個(gè)SQL命令executescript(sql_script)執(zhí)行多條SQL語(yǔ)句fetchone()獲取查詢結(jié)果集中的一行,返回值為單一序列;當(dāng)沒(méi)有可用數(shù)據(jù)時(shí),返回Nonefetchmany(size=1)獲取查詢結(jié)果集中的多行,返回一個(gè)列表;當(dāng)沒(méi)有可用數(shù)據(jù)時(shí),返回空列表。size參數(shù)用于指定獲取的行數(shù)fetchall()獲取查詢結(jié)果集中的所有(剩余)行,返回一個(gè)列表;當(dāng)沒(méi)有可用數(shù)據(jù)時(shí),返回空列表12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)-操作數(shù)據(jù)庫(kù)的總體流程importsqlite3con=sqlite3.connect("mental_test.db")cursor=con.cursor()cursor.execute('select*fromuser')result_list=cursor.fetchall()con.close()連接數(shù)據(jù)庫(kù),并返回一個(gè)Connection對(duì)象通過(guò)Connection對(duì)象,創(chuàng)建一個(gè)Cursor對(duì)象調(diào)用Cursor對(duì)象的excute()、excutemany()或者excutescript()執(zhí)行一行或者多行SQL語(yǔ)句如果執(zhí)行的SQL語(yǔ)句是查詢語(yǔ)句,則通過(guò)Cursor對(duì)象的fetchone()、fetchmany()或者fetchall()方法獲取查詢結(jié)果;如果執(zhí)行的SQL語(yǔ)句是添加、修改或者刪除數(shù)據(jù)的SQL語(yǔ)句,則需要通過(guò)Connection對(duì)象的commit()方法向數(shù)據(jù)庫(kù)提交修改。關(guān)閉數(shù)據(jù)庫(kù)12.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2.5使用Python操作SQLite數(shù)據(jù)庫(kù)-操作數(shù)據(jù)庫(kù)的總體流程使用Python向user表中插入數(shù)據(jù)importsqlite3con=sqlite3.connect("mental_test.db")cursor=con.cursor()id,password,role="202203","202203","學(xué)生"cursor.execute(f'INSERTINTOuser(id,password,role)VALUES("{id}","{password}","{role}")')mit()con.close()12.3PyQt6GUI界面設(shè)計(jì)PyQt6簡(jiǎn)介PyQt6的安裝與配置QtDesigner的使用項(xiàng)目PyQt6控件的使用項(xiàng)目PyQt6信號(hào)與槽的使用項(xiàng)目界面設(shè)計(jì)12.3PyQt6GUI界面設(shè)計(jì)12.3.1PyQt6簡(jiǎn)介Qt是C++語(yǔ)言編寫的跨平臺(tái)GUI庫(kù),圖形用戶界面(GraphicalUserInterface,GUI)是使用戶能通過(guò)圖像或圖形與設(shè)備進(jìn)行交互的程序接口。PyQt是Qt框架的Python語(yǔ)言實(shí)現(xiàn),既保留了Qt的高運(yùn)行速率,又提高了開(kāi)發(fā)效率,PyQt幾乎能實(shí)現(xiàn)Qt的所有功能。GUI在過(guò)去的一段時(shí)間是主流應(yīng)用,但是Web應(yīng)用由于其不用安裝直接在瀏覽器中就能運(yùn)行的優(yōu)勢(shì),在近幾年格外流行。但是實(shí)際上,Web應(yīng)用在瀏覽器部分的邏輯代碼大多由JavaScript語(yǔ)言編寫,運(yùn)行效率較低,且無(wú)法完全控制本機(jī)硬件,例如攝像頭、藍(lán)牙設(shè)備、打印機(jī)等,而Web應(yīng)用的劣勢(shì)恰好是GUI的強(qiáng)項(xiàng),故GUI仍會(huì)占有重要的地位。12.3PyQt6GUI界面設(shè)計(jì)12.31PyQt6簡(jiǎn)介在Python中,實(shí)現(xiàn)GUI編程的不僅有PyQt庫(kù),還有Tkinter、PySide等庫(kù),但是Tkinter不具有類似于PyQt中的QtDesigner(UI設(shè)計(jì)工具,可視化創(chuàng)建UI文件,并能通過(guò)工具快速編譯Python文件,即自動(dòng)生成UI代碼)的工具,PySide的官方文檔不夠細(xì)致,使用者不夠廣泛,故本項(xiàng)目選擇使用PyQt實(shí)現(xiàn)GUI。本項(xiàng)目使用最新的PyQt6版本。12.3PyQt6GUI界面設(shè)計(jì)12.3.2PyQt6的安裝與配置PyQt6是Python的第三方庫(kù),對(duì)PyQt6以及QtDesigner進(jìn)行安裝,需要使用pip工具pipinstallPyQt6pipinstallPyQt6-tools需要對(duì)以下兩個(gè)工具進(jìn)行配置:designer.exe:用于可視化設(shè)計(jì)GUI界面pyuic6.exe:用于將可視化GUI文件轉(zhuǎn)化為Python代碼12.3PyQt6GUI界面設(shè)計(jì)12.3.2PyQt6的安裝與配置12.3PyQt6GUI界面設(shè)計(jì)12.3.2PyQt6的安裝與配置-designer.exe12.3PyQt6GUI界面設(shè)計(jì)12.3.2PyQt6的安裝與配置-pyuic6.exeAuguments參數(shù)用于設(shè)置.ui文件轉(zhuǎn)化為.py文件的文件名,$FileName$表示.ui文件名稱,-o表示將.ui文件內(nèi)容輸出.py文件,$FileNameWithoutExtension$.py表示輸出的.py文件名設(shè)置為.ui文件去掉后綴并加上.py,-x用于設(shè)置轉(zhuǎn)換后的.py文件可以直接運(yùn)行彈出窗口界面。12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用QtDesigner的使用:打開(kāi)QtDesigner工具QtDesigner界面說(shuō)明QtDesigner界面布局.ui文件轉(zhuǎn)換為.py文件的方法生成的.py文件的結(jié)構(gòu)說(shuō)明12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-打開(kāi)QtDesigner工具12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-QtDesigner界面說(shuō)明12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-QtDesigner界面布局使用柵格布局,使界面中控件排列變得整齊。除了柵格布局,還有水平布局、垂直布局等。12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-QtDesigner界面布局在柵格布局中可以通過(guò)彈簧對(duì)控件間距進(jìn)行調(diào)整12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-QtDesigner界面布局對(duì)窗口中控件整體進(jìn)行柵格布局設(shè)計(jì),可以使控件自適應(yīng)窗口大小。12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-QtDesigner界面布局在菜單欄中選擇“窗體”→“預(yù)覽”或者使用Ctrl+R快捷鍵可以對(duì)窗口進(jìn)行預(yù)覽12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-.ui文件轉(zhuǎn)換為.py文件12.3PyQt6GUI界面設(shè)計(jì)12.3.3QtDesigner的使用-生成的.py文件結(jié)構(gòu)說(shuō)明12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用PyQt6中存在有QMainWindow(主窗口)、QWidget(窗口)、對(duì)話框類、按鈕類、文本框類等豐富多樣的控件。QMainWindow、QWidget和QDialog三個(gè)類都用于創(chuàng)建窗口。QMainWindow窗口可以包含菜單欄、工具欄、狀態(tài)欄等,是最常見(jiàn)的窗口形式;QDialog是對(duì)話框窗口的基類,用于執(zhí)行短期任務(wù),或者與用戶進(jìn)行交互。主窗口則使用QMainWindow,對(duì)話框則使用QDialog,可能作為頂層窗口也可能嵌入其它窗口的情況下使用QWidget類。12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-QWidgetQWidget類是所有用戶界面的基類,所有的窗口和控件都直接或間接繼承自QWidget類。窗口是指程序的整體界面,包含最小化、最大化、關(guān)閉按鈕等,控件指按鈕、文本框、表格、進(jìn)度條等租車行程序的基本元素。類別方法說(shuō)明窗口設(shè)置show()顯示窗口hide()隱藏窗口close()關(guān)閉窗口x()、y()獲取窗口左上角的坐標(biāo)幾何設(shè)置width()、height()客戶區(qū)(窗口除標(biāo)題和邊框外的區(qū)域)的寬度和高度setGeometry(QRect(x,y,width,height))參數(shù)為QRect對(duì)象,用于改變客戶區(qū)的大小和位置,設(shè)置窗口左上角坐標(biāo)為x,y,設(shè)置寬高為width和heightgeometry()獲取客戶區(qū)的大小和位置resize(width,height)改變客戶區(qū)的大小,寬為width,高為heightsize()獲取客戶區(qū)的大小move(x,y)設(shè)置窗口的位置頂層設(shè)置setWindowTitle(str)設(shè)置窗口標(biāo)題為strsetWindowIcon(QIcon)參數(shù)為QIcon類型的對(duì)象,用于設(shè)置程序圖標(biāo)12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-QDialogQDialog類用于創(chuàng)建對(duì)話框,提供一系列對(duì)話框完成特定場(chǎng)景下的功能方法說(shuō)明setWindowTitle()設(shè)置對(duì)話框標(biāo)題setWindowModality()設(shè)置窗口模態(tài),取值如下:Qt.WindowModality.NonModal,非模態(tài),可以與其它窗口交互Qt.WindowModality.WindowModal,窗口模態(tài),阻止對(duì)其父窗口進(jìn)行交互Qt.WindowModality.ApplicationModal,應(yīng)用程序模態(tài),阻止和其它所有窗口進(jìn)行交互12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-QDialogQMessageBox是QDialog的繼承類,它是一種通用的彈出式對(duì)話框,用于通知用戶或者請(qǐng)求用戶的提問(wèn)和接收應(yīng)答。方法說(shuō)明示例顯示效果information(QWidget,title,text,buttons,defaultButton)消息對(duì)話框,參數(shù)含義如下:QWidget,指定的父窗口控件title,對(duì)話框標(biāo)題text,對(duì)話框文本buttons,多個(gè)標(biāo)準(zhǔn)按鈕,默認(rèn)為OK按鈕defaultButtonp,默認(rèn)選中的標(biāo)準(zhǔn)按鈕,默認(rèn)值為第一個(gè)標(biāo)準(zhǔn)按鈕QMessageBrmation(self,"提示","消息對(duì)話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)
question(QWidget,title,text,buttons,defaultButton)問(wèn)答對(duì)話框,參數(shù)解釋同information()QMessageBox.question(self,"提問(wèn)","提問(wèn)對(duì)話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)
warning(QWidget,title,text,buttons,defaultButton)警告對(duì)話框,參數(shù)解釋同information()QMessageBox.warning(self,"警告","警告對(duì)話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)
critical(QWidget,title,text,buttons,defaultButton)嚴(yán)重錯(cuò)誤對(duì)話框,參數(shù)解釋同information()QMessageBox.critical(self,"嚴(yán)重錯(cuò)誤","嚴(yán)重錯(cuò)誤對(duì)話框",QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No)12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-標(biāo)簽控件:QLabelQLabel類用于創(chuàng)建標(biāo)簽對(duì)象,可以顯示不可編輯的文本、圖片或者gif動(dòng)圖等方法說(shuō)明setText(str)設(shè)置標(biāo)簽的文本內(nèi)容為strtext()返回標(biāo)簽的文本內(nèi)容12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-文本框類控件:QLineEditQLintEdit類用于創(chuàng)建單行文本框控件,可以輸入單行字符串,輸入多行字符串需要使用QTextEdit。方法說(shuō)明setText(str)設(shè)置文本框內(nèi)容為strtext()返回文本框內(nèi)容setEchoMode()設(shè)置文本框顯示格式,文本顯示格式的值如下:QLineEdit.EchoMode.Normal,正常顯示輸入的字符,為默認(rèn)選項(xiàng)QLineEdit.EchoMode.NoEcho,不顯示任何輸入的字符,常用語(yǔ)密碼類型的輸入,且其密碼長(zhǎng)度需要保密時(shí)QLineEdit.EchoMode.Password,顯示平臺(tái)相關(guān)的密碼掩碼字符而不是實(shí)際輸入的字符QLineEdit.EchoMode.PasswordEchoOnEdit,在編輯時(shí)顯示字符,負(fù)責(zé)顯示密碼類型的輸入setReadOnly()設(shè)置文本框?yàn)橹蛔x的,參數(shù)為True或False,其中True為只讀,然則不是只讀的12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-文本框類控件:QTextEditQTextEdit類用于創(chuàng)建多行文本框控件,可以顯示多行文本內(nèi)容,當(dāng)文本內(nèi)容超出控件顯示范圍時(shí),可以顯示水平垂直滾動(dòng)條。方法說(shuō)明setPlainText(str)設(shè)置多行文本框的文本內(nèi)容為strtoPlainText()返回多行文本框的文本內(nèi)容12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-按鈕類控件:QPushButtonQPushButton用于創(chuàng)建長(zhǎng)方形的按鈕,可以顯示文本、圖標(biāo)等,單擊按鈕可以執(zhí)行相應(yīng)的命令或者響應(yīng)事件。方法說(shuō)明setText(str)設(shè)置按鈕的顯示文本為strtext()返回按鈕的顯示文本為了使按鈕操作方便,可以為QPushButton設(shè)置快捷鍵。設(shè)置快捷鍵需要使用方法setShortcut()。#Key_后加某個(gè)鍵名一般可以把某個(gè)鍵作為快捷鍵pushButton.setShortcut(Qt.Key.Key_Return) #回車鍵作為快捷方式pushButton.setShortcut(Qt.Key.Key_Tab) #Tab鍵作為快捷方式#組合鍵可以用引號(hào)來(lái)表示,注意與其它軟件快捷鍵是否沖突pushButton.setShortcut("Alt+S") #以Alt+S鍵作為快捷方式12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-按鈕類控件:QRadioButtonQRadioButton用于創(chuàng)建單選按鈕,為用戶提供多選一的功能。QRadioButton創(chuàng)建的單選按鈕默認(rèn)是獨(dú)占的(Exclusive),對(duì)于繼承自同一父類Widget的多個(gè)單選按鈕屬于同一個(gè)按鈕組合,在單選按鈕組合中,一次只能選擇一個(gè)單選按鈕。如果需要多個(gè)按鈕組合,則需要將它們放在QGroupBox或QButtonGroup中。方法說(shuō)明setText(str)設(shè)置單選按鈕的顯示文本為strtext()返回單選按鈕的顯示文本isChecked()返回單選按鈕的狀態(tài),返回值為True或FalsesetChecked(bool)設(shè)置單選按鈕的狀態(tài),True為選中,F(xiàn)alse為未選中setAutoExclusive(bool)設(shè)置自動(dòng)排它特性,True時(shí)表示屬于同一父部件的按鈕任何時(shí)候只能選中一個(gè)按鈕12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-下拉列表框控件:QComboBoxQComboBox用于創(chuàng)建下拉列表框,集按鈕和下拉選項(xiàng)于一體方法說(shuō)明addItem()添加一個(gè)下拉選項(xiàng)addItems()從列表中添加下拉選項(xiàng)currentText()返回選中選項(xiàng)的文本currentIndex()返回選中選項(xiàng)的索引12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-表格控件:QTableWidgetQTableWidget用于創(chuàng)建數(shù)據(jù)表格,每一個(gè)單元數(shù)據(jù)是通過(guò)QTableWidgetItem對(duì)象實(shí)現(xiàn)的方法說(shuō)明setRowCount()設(shè)置QTableWidget表格控件的行數(shù)setColumnCount()設(shè)置QTableWidget表格控件的列數(shù)setItem(int,int,QTableWidgetItem)對(duì)QTableWidget表格控件中的指定單元格處添加數(shù)據(jù),通常是文本、圖標(biāo)、復(fù)選框等,前兩個(gè)參數(shù)分別表示行和列setCellWidget(int,int,QWidget)對(duì)QTableWidget表格控件中的指定單元格處添加控件,前兩個(gè)參數(shù)分別表示行和列,第3個(gè)參數(shù)為添加的控件setEditTriggers()設(shè)置表格是否可編輯,設(shè)置編輯規(guī)則枚舉值,常用類型如下:QAbstractItemView.EditTrigger.NoEditTriggers不能對(duì)表格內(nèi)容進(jìn)行修改QAbstractItemView.EditTrigger.CurrentChanged任何時(shí)候可修改QAbstractItemView.EditTrigger.DoubleClicked雙擊時(shí)修改setSelectionBehavior()設(shè)置表格的選擇行為,常用行為如下:QAbstractItemView.SelectionBehavior.SelectItems選中單元格QAbstractItemView.SelectionBehavior.SelectRows選中一行QAbstractItemView.SelectionBehavior.SelectColumns選中一列12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-列表控件:QListWidgetQListWidget用于創(chuàng)建數(shù)據(jù)列表,可以從列表中添加或刪除條目,列表中的每個(gè)條目都是一個(gè)QListWidgetItem對(duì)象。方法說(shuō)明addItem()在列表中添加QListWidgetIem對(duì)象或字符串item(int)如果指定列存在則返回指定列的內(nèi)容,否則返回Nullrow(QListWidgetItem)返回指定項(xiàng)目所在的行12.3PyQt6GUI界面設(shè)計(jì)12.3.4項(xiàng)目PyQt6控件的使用-列表控件:QListWidgetQDateTimeEdit用于創(chuàng)建編輯日期時(shí)間的控件,可以使用鍵盤的上下按鈕來(lái)增加或者減少日期時(shí)間值。方法說(shuō)明setDisplayFormat()設(shè)置時(shí)間日期格式:yyyy,代表年份,4位數(shù)的數(shù)值MM,代表月份,取值范圍為01~12dd,代表日,取值范圍為01~31HH,代表小時(shí),取值范圍為00~23mm,代表分鐘,取值范圍為00~59ss,代表秒,取值范圍為00~59setDateTime(Union[QDateTime,datetime.datetime])設(shè)置具體的時(shí)間和日期,參數(shù)為QDateTime類型12.3PyQt6GUI界面設(shè)計(jì)12.3.5項(xiàng)目PyQt6信號(hào)與槽的使用信號(hào)(Signal)和槽(Slot)是Qt中的核心機(jī)制,也同樣適用于PyQt中對(duì)象之間的通信,所有繼承于QWidget的控件都支持信號(hào)與槽機(jī)制。當(dāng)信號(hào)發(fā)射時(shí),連接的槽函數(shù)會(huì)自動(dòng)執(zhí)行,在PyQt6中信號(hào)與槽通過(guò)object.signal.connect()方法連接。一個(gè)信號(hào)可以連接多個(gè)槽,一個(gè)信號(hào)可以連接另一個(gè)信號(hào),一個(gè)槽可以監(jiān)聽(tīng)多個(gè)信號(hào)。12.3PyQt6GUI界面設(shè)計(jì)12.3.5項(xiàng)目PyQt6信號(hào)與槽的使用-內(nèi)置信號(hào)和槽函數(shù)的連接內(nèi)置信號(hào)有多種形式,例如標(biāo)題改變windowTitleChanged,文本內(nèi)容改變textChanged,按鈕被點(diǎn)擊clicked,按鈕被按下pressed等。classMyWidget(QWidget):def__init__(self):QWidget.__init__(self)#繼承父類QWidget的屬性、方法等self.resize(300,100)#設(shè)置窗口大小為300,100self.setWindowTitle("內(nèi)置信號(hào)與槽函數(shù)的連接")#設(shè)置窗口標(biāo)題button=QPushButton(self)#創(chuàng)建一個(gè)按鈕button.setText("這是一個(gè)按鈕")#設(shè)置按鈕的文本內(nèi)容#建立信號(hào)與槽之間的連接,信號(hào)為按鈕點(diǎn)擊clicked,槽函數(shù)僅傳遞函數(shù)名,即窗口關(guān)閉函數(shù)close()的函數(shù)名closebutton.clicked.connect(self.close)if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()#創(chuàng)建自定義的窗口類MyWidgetwindow.show()#顯示窗口sys.exit(app.exec())#確保窗口主循環(huán)安全結(jié)束點(diǎn)擊按鈕時(shí)關(guān)閉窗口12.3PyQt6GUI界面設(shè)計(jì)12.3.5項(xiàng)目PyQt6信號(hào)與槽的使用-內(nèi)置信號(hào)和自定義槽函數(shù)的連接fromPyQt6.QtWidgetsimport*importsysclassMyWidget(QWidget):def__init__(self):QWidget.__init__(self)self.resize(400,100)self.setWindowTitle("內(nèi)置信號(hào)與自定義槽函數(shù)的連接")button=QPushButton(self)button.setText("點(diǎn)擊按鈕改變窗口標(biāo)題")#clicked信號(hào)與槽函數(shù)button_change連接button.clicked.connect(self.button_change)defbutton_change(self):self.setWindowTitle("按鈕已點(diǎn)擊")if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()window.show()sys.exit(app.exec())點(diǎn)擊按鈕時(shí),改變窗口標(biāo)題為“按鈕已點(diǎn)擊”當(dāng)槽函數(shù)中的語(yǔ)句僅有一行時(shí),可以將槽函數(shù)寫成匿名函數(shù)的形式,第11~13行可以替換為以下代碼:button.clicked.connect(lambda:self.setWindowTitle("按鈕已點(diǎn)擊"))12.3PyQt6GUI界面設(shè)計(jì)12.3.5項(xiàng)目PyQt6信號(hào)與槽的使用-槽函數(shù)的傳參槽函數(shù)的傳參可以使用functools模塊中的partial對(duì)象fromfunctoolsimportpartialpartial(func[,*args][,**keywords])func為函數(shù)名,*args以及**keywords為向函數(shù)func傳遞的參數(shù)。12.3PyQt6GUI界面設(shè)計(jì)12.3.5項(xiàng)目PyQt6信號(hào)與槽的使用-槽函數(shù)的傳參fromPyQt6.QtWidgetsimport*fromfunctoolsimportpartialimportsysclassMyWidget(QWidget):def__init__(self):QWidget.__init__(self)self.resize(300,100)self.setWindowTitle("槽函數(shù)的傳參")button=QPushButton(self)button.setText("點(diǎn)擊按鈕改變窗口標(biāo)題")#clicked信號(hào)與槽函數(shù)button_change連接button.clicked.connect(partial(self.button_change,"小千"))defbutton_change(self,name):self.setWindowTitle(f"{name},你好!")if__name__=='__main__':app=QApplication(sys.argv)window=MyWidget()window.show()sys.exit(app.exec())點(diǎn)擊按鈕時(shí),改變窗口標(biāo)題為“小千,你好!”12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)以下將對(duì)項(xiàng)目的界面設(shè)計(jì)進(jìn)行介紹,主要包括項(xiàng)目界面所用控件、布局以及界面之間的關(guān)系。注意項(xiàng)目中所有的對(duì)話框均選擇應(yīng)用程序模態(tài)(ApplicationModel),阻止和其它所有窗口進(jìn)行交互。項(xiàng)目界面間關(guān)系12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-用戶登錄界面用戶登錄界面以管理員登錄則跳轉(zhuǎn)用戶管理界面,以學(xué)生登錄則跳轉(zhuǎn)學(xué)生心理自測(cè)界面,以心理教師登錄則跳轉(zhuǎn)心理教師輔導(dǎo)界面。用戶登錄界面存放在login.ui文件中(對(duì)應(yīng)于login.py文件)12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-用戶管理界面用戶管理界面用于管理心理教師和學(xué)生的信息,可以進(jìn)行添加、編輯和刪除操作。點(diǎn)擊“搜索”按鈕可以按照條件對(duì)記錄進(jìn)行檢索并顯示在表格中。用戶管理界面存放于admin.ui文件中(對(duì)應(yīng)于admin.py文件)。12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-用戶管理界面選中一列數(shù)據(jù),點(diǎn)擊“刪除”按鈕即可對(duì)數(shù)據(jù)項(xiàng)進(jìn)行刪除。點(diǎn)擊“添加”或者“編輯”按鈕,會(huì)彈出可以編輯教師或者學(xué)生信息的對(duì)話框,對(duì)話框存放于teacher_detail.ui和student_detail.ui文件中(對(duì)應(yīng)于teacher_detail.py和student_detail.py文件)。12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-學(xué)生心理自測(cè)界面學(xué)生心理自測(cè)界面用于學(xué)生進(jìn)行心理自測(cè),對(duì)自測(cè)結(jié)果進(jìn)行查看以及學(xué)生修改登錄密碼。學(xué)生心理自測(cè)界面存放于student.ui文件中(對(duì)應(yīng)于student.py)?!耙钟舭Y測(cè)試”頁(yè)面“查看已測(cè)結(jié)果”頁(yè)面“修改密碼”頁(yè)面12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-學(xué)生心理自測(cè)界面學(xué)生點(diǎn)擊“開(kāi)始測(cè)試”按鈕,即會(huì)出現(xiàn)心理測(cè)試題目及選項(xiàng)。當(dāng)測(cè)試結(jié)果是有抑郁傾向時(shí),會(huì)出現(xiàn)“選擇輔導(dǎo)老師”按鈕。點(diǎn)擊圖中的“選擇輔導(dǎo)老師”按鈕,會(huì)彈出選擇輔導(dǎo)老師的對(duì)話框,存放于choice_teacher.ui文件中(對(duì)應(yīng)于choice_teacher.py文件)12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-學(xué)生心理自測(cè)界面對(duì)于“查看已測(cè)結(jié)果”頁(yè)面,表格最后一列“查看詳情”設(shè)置為按鈕控件,文本內(nèi)容為“查看”。點(diǎn)擊“查看”按鈕,會(huì)彈出對(duì)話框,顯示記錄詳情。對(duì)話框存放于record_detail.ui文件中(對(duì)應(yīng)于record_detail.py文件)。12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-心理教師輔導(dǎo)界面心理教師輔導(dǎo)界面用于教師進(jìn)行心理輔導(dǎo),對(duì)選擇自己的學(xué)生的心理測(cè)試結(jié)果進(jìn)行查看,與學(xué)生約定咨詢時(shí)間并提出咨詢建議,修改登錄密碼。心理教師輔導(dǎo)界面存放于teacher.ui文件中(對(duì)應(yīng)于teacher.py)12.3PyQt6GUI界面設(shè)計(jì)12.3.6項(xiàng)目界面設(shè)計(jì)-心理教師輔導(dǎo)界面在“學(xué)生情況”頁(yè)面中,表格最后一列“輔導(dǎo)”設(shè)置為按鈕控件,如果學(xué)生未被輔導(dǎo),則按鈕文本設(shè)置為“輔導(dǎo)”;如果學(xué)生已被輔導(dǎo),則按鈕文本顯示為“查看”。點(diǎn)擊按鈕,會(huì)彈出對(duì)話框,顯示學(xué)生具體詳情。對(duì)話框存放于tutor_detail.ui文件中(對(duì)應(yīng)于tutor_detail.py文件)。12.4系統(tǒng)總體設(shè)計(jì)程序設(shè)計(jì)思路系統(tǒng)模塊設(shè)計(jì)12.4系統(tǒng)總體設(shè)計(jì)12.4.1程序設(shè)計(jì)思路12.4系統(tǒng)總體設(shè)計(jì)12.4.2系統(tǒng)模塊設(shè)計(jì)12.5系統(tǒng)詳細(xì)設(shè)計(jì)用戶登錄功能用戶管理功能心理測(cè)試功能心理輔導(dǎo)功能修改密碼功能12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.1用戶登錄功能-界面控件名稱用戶登錄界面所用的控件名稱(login.ui)12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.1用戶登錄功能-方法及其實(shí)現(xiàn)功能用戶登錄功能實(shí)現(xiàn)在mental_test.py文件中方法實(shí)現(xiàn)功能所屬類__init__()初始化界面,建立信號(hào)與槽的連接,設(shè)置快捷方式Loginverify()驗(yàn)證用戶登錄Loginmain()初始化系統(tǒng)應(yīng)用無(wú)12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.1用戶登錄功能-程序的具體實(shí)現(xiàn)-__init__()方法def__init__(self):QWidget.__init__(self)loginui.setupUi(self)#使loginui中的設(shè)計(jì)展示在用戶登錄窗口上loginui.pushButton.clicked.connect(self.verify)#建立pushButton按鈕clicked信號(hào)與槽函數(shù)verify()的連接loginui.pushButton.setShortcut(Qt.Key.Key_Return)#設(shè)置快捷方式12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.1用戶登錄功能-程序的具體實(shí)現(xiàn)-verify()方法defverify(self):username=loginui.lineEdit.text()#獲取lineEdit的文本內(nèi)容password=loginui.lineEdit_2.text()#獲取lineEdit_2的文本內(nèi)容#從數(shù)據(jù)庫(kù)user表中查找id為username,password為password的記錄sql=f"SELECT*FROMuserWHEREid='{username}'ANDpassword='{password}'"cursor.execute(sql)#執(zhí)行sql語(yǔ)句res=cursor.fetchone()#取出查詢記錄中的第一條ifresisNone:#如果記錄為空,說(shuō)明用戶名或密碼有誤mb=QMessageBox()mb.critical(self,"提示","用戶名或密碼有誤")#創(chuàng)建嚴(yán)重警告對(duì)話框loginui.lineEdit_2.setText("")#清空l(shuí)ineEdit_2的內(nèi)容mb.show()#顯示對(duì)話框elifres[2]=="管理員":#登錄人員為管理員self.window2=admin_func.Admin()#調(diào)用管理員界面self.close()#關(guān)閉當(dāng)前登錄界面self.window2.show()#顯示管理員界面self.window2.setWindowIcon(QIcon("icons:mental_test.png"))#設(shè)置圖標(biāo)elifres[2]=="學(xué)生":#登錄人員為學(xué)生self.window2=student_func.Student(username)#調(diào)用學(xué)生自測(cè)界面self.close()#關(guān)閉當(dāng)前登錄界面self.window2.show()#顯示學(xué)生自測(cè)界面self.window2.setWindowIcon(QIcon("icons:mental_test.png")elifres[2]=="老師":#登錄人員為教師self.window2=teacher_func.Teacher(username)#調(diào)用教師輔導(dǎo)界面self.close()#關(guān)閉當(dāng)前登錄界面self.window2.show()#顯示教師輔導(dǎo)界面self.window2.setWindowIcon(QIcon("icons:mental_test.png"))12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.1用戶登錄功能-程序的具體實(shí)現(xiàn)-main()方法defmain():app=QApplication(sys.argv)window=Login()#創(chuàng)建控件類Login的實(shí)例對(duì)象window.setWindowIcon(QIcon("icons:mental_test.png"))#設(shè)置圖標(biāo)window.show()sys.exit(app.exec())12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-界面控件名稱“心理教師信息”頁(yè)面(admin.ui)“教師信息”對(duì)話框(teacher_detail.ui)“學(xué)生信息”頁(yè)面(admin.ui)“學(xué)生信息”對(duì)話框(student_detail.ui)12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-方法及其實(shí)現(xiàn)功能用戶管理功能實(shí)現(xiàn)在admin_func.py文件中方法實(shí)現(xiàn)功能所屬類__init__()初始化界面,顯示教師和寫生信息,建立信號(hào)與槽的連接,設(shè)置快捷方式Adminshow_teacher_info(self,para="")展示教師信息,para參數(shù)為字符串格式,用于查找信息的SQL語(yǔ)句條件拼接Adminsearch_teacher()檢索教師信息Adminadd_teacher()初始化添加教師信息對(duì)話框,建立信號(hào)與槽的連接Adminadd_Tbutton()添加教師對(duì)話框中“確定”按鈕的槽函數(shù),用于添加教師信息Adminedit_teacher()初始化編輯教師信息對(duì)話框,建立信號(hào)與槽的連接Adminedit_Tbutton()編輯教師對(duì)話框中“確定”按鈕的槽函數(shù),用于編輯教師信息Admindel_teacher()初始化刪除教師信息提示框,建立信號(hào)與槽的連接Adminchange_Tbutton()刪除教師信息提示框中按鈕的槽函數(shù),用于刪除教師信息Adminshow_student_info(self,para="")展示學(xué)生信息,para參數(shù)為字符串格式,用于查找信息的SQL語(yǔ)句條件拼接Adminsearch_student()檢索學(xué)生信息Adminadd_student()初始化添加學(xué)生信息對(duì)話框,建立信號(hào)與槽的連接Adminadd_Sbutton()添加學(xué)生對(duì)話框中“確定”按鈕的槽函數(shù),用于添加學(xué)生信息Adminedit_student()初始化編輯學(xué)生信息對(duì)話框,建立信號(hào)與槽的連接Adminedit_Sbutton()編輯學(xué)生對(duì)話框中“確定”按鈕的槽函數(shù),用于編輯學(xué)生信息Admindel_student()初始化刪除學(xué)生信息提示框,建立信號(hào)與槽的連接Adminchange_Sbutton()刪除學(xué)生信息提示框中按鈕的槽函數(shù),用于刪除學(xué)生信息Admin12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-__init__()方法def__init__(self):QWidget.__init__(self)adminui.setupUi(self)self.show_teacher_info()#展示教師信息self.show_student_info()#展示學(xué)生信息adminui.addTButton.clicked.connect(self.add_teacher)#添加教師信息adminui.editTButton.clicked.connect(self.edit_teacher)#編輯教師信息adminui.delTButton.clicked.connect(self.del_teacher)#刪除教師信息adminui.searchTButton.clicked.connect(self.search_teacher)#檢索教師信息adminui.searchTButton.setShortcut(Qt.Key.Key_Return)#設(shè)置快捷鍵12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-show_teacher_info(self,para="")方法defshow_teacher_info(self,para=""):#para用于SQL語(yǔ)句的拼接,按條件進(jìn)行查詢sql=f"SELECT*FROMteacher{para}ORDERBYid"#按照id排列教師信息,當(dāng)para為None時(shí),則顯示所有信息cursor.execute(sql)teacher_list=cursor.fetchall()adminui.teacherTab.setRowCount(len(teacher_list))#按照教師個(gè)數(shù)設(shè)置表格行數(shù)forrowinrange(len(teacher_list)):forcellinrange(len(teacher_list[row])):adminui.teacherTab.setItem(row,cell,QTableWidgetItem(teacher_list[row][cell]))#將數(shù)據(jù)庫(kù)中取出的數(shù)據(jù)逐個(gè)填入單元格中12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-search_teacher()方法defsearch_teacher(self):ifadminui.teacherBox.currentText()=="工號(hào)":id=adminui.teacherEdit.text()para=f'WHEREidLIKE"%{id}%"'#設(shè)置參數(shù)para為模糊查詢工號(hào)idself.show_teacher_info(para)#將para傳入show_teacher_info()方法中重新顯示列表else:name=adminui.teacherEdit.text()para=f'WHEREnameLIKE"%{name}%"'#設(shè)置參數(shù)para為模糊查詢姓名nameself.show_teacher_info(para)#將para傳入show_teacher_info()方法中重新顯示列表12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-add_teacher()方法defadd_teacher(self):#創(chuàng)建添加教師時(shí)展示的對(duì)話框,設(shè)置按鈕點(diǎn)擊信號(hào)的槽函數(shù)self.Tdialog=QDialog()self.Tdialog.setWindowModality(Qt.WindowModality.ApplicationModal)self.Tdialogui=teacher_detail.Ui_Dialog()self.Tdialogui.setupUi(self.Tdialog)self.Tdialogui.okButton.clicked.connect(self.add_Tbutton)self.Tdialogui.cancelButton.clicked.connect(self.Tdialog.close)self.Tdialog.show()self.Tdialog.exec()12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-add_Tbutton()方法defadd_Tbutton(self):id=self.Tdialogui.idEdit.text()#獲取對(duì)話框中工號(hào)信息name=self.TEdit.text()#獲取對(duì)話框中姓名信息sex=self.Tdialogui.sexBox.currentText()#獲取對(duì)話框中性別信息select_sql=f"SELECTidFROMuser;"#取出數(shù)據(jù)庫(kù)中user表中所有信息cursor.execute(select_sql)id_list=cursor.fetchall()#獲取user表中的所有idifnotidornotnameorid.isspace()orname.isspace():#教師的工號(hào)或者姓名不能為空mb=QMessageBox()mb.warning(self,"失敗","教師的工號(hào)和姓名不能為空!")elif(id,)inid_list:#工號(hào)已存在時(shí)提示不能添加mb=QMessageBox()mb.warning(self,"失敗","該人員已存在,不能添加!")else:#工號(hào)不存在時(shí)可以添加#添加教師時(shí),需要分別向teacher表和user表中增加一條數(shù)據(jù),添加教師的同時(shí)為其分配用戶sql=f'INSERTINTOteacher(id,name,sex)VALUES("{id}","{name}","{sex}");'\f'INSERTINTOuser(id,password,role)VALUES("{id}","{id}","老師");'cursor.executescript(sql)mit()mb=QMessageBox()rmation(self,"成功","添加教師成功!")
self.search_teacher()#添加教師信息后,更新教師信息顯示self.Tdialogui.idEdit.setText("")self.TEdit.setText("")12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-edit_teacher()方法defedit_teacher(self):items=adminui.teacherTab.selectedItems()#獲取表格中選擇的記錄ifnotitems:#如果沒(méi)有選擇記錄,則進(jìn)行提示mb=QMessageBox()rmation(self,"提示","選中記錄后才能編輯,請(qǐng)選擇記錄!")else:#選擇教師記錄后對(duì)此記錄進(jìn)行編輯self.Tdialog=QDialog()self.Tdialog.setWindowModality(Qt.WindowModality.ApplicationModal)self.Tdialogui=teacher_detail.Ui_Dialog()self.Tdialogui.setupUi(self.Tdialog)self.Tdialogui.idEdit.setText(items[0].text())self.TEdit.setText(items[1].text())#使用index()函數(shù)得到記錄中性別在("男","女")中的索引,再令下拉選擇框顯示索引位置的內(nèi)容self.Tdialogui.sexBox.setCurrentIndex(("男","女").index(items[2].text()))#設(shè)置idEdit為只讀形式,教師id不能修改,否則會(huì)影響登錄時(shí)用戶類型判斷self.Tdialogui.idEdit.setReadOnly(True)self.Tdialogui.okButton.clicked.connect(self.edit_Tbutton)self.Tdialogui.cancelButton.clicked.connect(self.Tdialog.close)self.Tdialog.show()self.Tdialog.exec()12.5系統(tǒng)詳細(xì)設(shè)計(jì)12.5.2用戶管理功能-程序的具體實(shí)現(xiàn)-edit_Tbutton()方法defedit_Tbutton(self):id=self.Tdialogui.idEdit.text()name=self.TEdit.text()sex=self.Tdialogui.sexBox.currentText()ifnotname:#姓名為空的時(shí)候無(wú)法提交mb=QMessageBox()rmation(self,"提示","姓名為空,無(wú)法提交!")else:sql=f'UPDATEteachersetname="{name}",sex="{sex}"whereid="{id}"'cursor.execute(sql)mit()mb=QMessageBox()rmation(self,"成功","編輯教師信息成功!")self.search_teacher()#編輯教師信息后,更新教師信息顯示self.Tdialog.clos
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一創(chuàng)意聚會(huì)活動(dòng)方案
- 六一尋寶活動(dòng)策劃方案
- 六一戲曲活動(dòng)方案
- 六一機(jī)關(guān)活動(dòng)方案
- 六一活動(dòng)拉花活動(dòng)方案
- 六一活動(dòng)活動(dòng)策劃方案
- 六一相親活動(dòng)方案
- 六一積分活動(dòng)方案
- 六一美食節(jié)活動(dòng)方案
- 六一食堂活動(dòng)方案
- 2024年陜西新華出版?zhèn)髅郊瘓F(tuán)有限責(zé)任公司招聘筆試沖刺題(帶答案解析)
- 農(nóng)村排灌用電安全管理
- 重慶開(kāi)放大學(xué)《工具書(shū)與文獻(xiàn)檢索》形考測(cè)驗(yàn)1-4答案
- 結(jié)節(jié)性紅斑的護(hù)理措施
- 江蘇省蘇州市四市2022-2023學(xué)年八年級(jí)下學(xué)期期末語(yǔ)文試題
- 幼兒園病媒生物防制培訓(xùn)方案
- “影子教育”之全球擴(kuò)張教育公平、質(zhì)量、發(fā)展中的利弊談
- (word版)2024年成人高考語(yǔ)文試題及答案
- MOOC Spark編程基礎(chǔ)-廈門大學(xué) 中國(guó)大學(xué)慕課答案
- 大易通用能力測(cè)評(píng)題庫(kù)
- 聯(lián)邦學(xué)習(xí)技術(shù)在人工智能中的應(yīng)用與發(fā)展前景
評(píng)論
0/150
提交評(píng)論