第一篇:Qt期末知識點總結大全
題型:選擇、判斷、簡答、程序設計
一、基本知識點 1.簡單解釋Qt。
2.QtGUI應用程序的main()程序結構。
3.利用QtCreator創建窗口時,系統提供的3個基類分別是什么?
4.信號與槽 機制作用,信號與插槽關聯函數connection()在那個類中定義,前4個參數的意義,兩種關聯(手動、自動)的區別。
5.模態和非模態對話框(概念、創建、初始化、運行、取結果)。6.標準對話框種類。
7.布局管理器的任務,布局及相關的類(QHBoxLayout、QVBoxLayout、QGridLayout、QStackLayout)管理窗體上子窗口部件的布局方法,以及編程方法。
8.QmainWindow框架包含的組件(圖5-2)QmainWindow各部件使用的編程方法。9.Qt對C++的一些擴展:Q_OBJECT、emit、moc、uic。
10.為應用程序提供圖片的常用方法(資源機制),如何使用資源 動作(action)。11.創建菜單和工具欄的步驟 中央窗口(中心部件)。12.事件概念,幾種常見的事件,Qt中定時的方法及編程。13.Qt中事件處理和事件過濾方法 事件傳遞順序。
14.順序容器(QVector(T)、QLinkedList(T)、QList(T)、QStack(T)、QQueue(T))關聯容器(QMap
16.QPainter的三個主要設置(畫筆、畫刷、字體)及相應的類(QPen/QBrush/QFont)。17.Qt中輸入輸出方法及相關類 文本文件和二進制文件讀寫操作。18.數據庫和網絡應用程序中,在pro文件中分別要加入什么模塊。
19.利用SQL語句Qt數據庫應用程序的基本操作步驟(連接、查詢、取結果),SQL模型類型。
20.Qt中與網絡相關的類(QNetworkAccessManager、QFtp、QHttp、QTcpSocket、QUdpSocket、QtcpServer),TCP客戶與服務器通信程序模型。21.線程概念及Qt相關類 線程的創建與啟動
22.線程的同步與互斥,方法(Qmutex、QreadWriteLock、Qsemphore、QWaitCondition)
二、簡單程序設計 1.對話框應用程序。
2.主窗口創建動作、工具欄、菜單的程序代碼。3.幾種布局方法的關鍵代碼。4.文本文件和二進制文件讀寫操作。
5.Qt數據庫基本應用程序(利用SQL語句或SQL查詢模型)6.簡單的TCP客戶與服務器程序
第二篇:期末知識點總結
第六單元土地面積
1、常用的土地面積單位:平方米、公頃、平方千米。測量土地的面積,常用“平方米”和“公頃”作單位。邊長是100米的正方形土地,.1公頃=10000平方米1平
1、真分數:分子比分母小的分數叫做真分數。真分數比1小。假分數:分子比分母大或者分子和分母相等的分數叫 4
5、分數的大小比較6
3、求最小公倍數的方法:(20作分母,把原來的小數去掉小數點作分子;化成分數后,能約分的要約分。、100、1000 注意:通分時要選用最小的公倍數做分母。
21、平行四邊形、三角形、梯形的面積計算公式。(數學書第96~102頁)平行四邊形面積= 底×高S=ah三角形面積=底×高÷2S=ah÷2梯形面積=(上底+下底)×高÷2第六單元土地面積
1、常用的土地面積單位:平方米、公頃、平方千米。測量土地的面積,常用“平方米”和“公頃”作單位。邊長是100米的正方形土地,.1公頃=10000平方米1平
1、真分數:分子比分母小的分數叫做真分數。真分數比1小。假分數:分子比分母大或者分子和分母相等的分數叫 4
5、分數的大小比較6
3、求最小公倍數的方法:(20作分母,把原來的小數去掉小數點作分子;化成分數后,能約分的要約分。、100、1000 注意:通分時要選用最小的公倍數做分母。
21、平行四邊形、三角形、梯形的面積計算公式。(數學書第96~102頁)平行四邊形面積= 底×高S=ah三角形面積=底×高÷2S=ah÷2梯形面積=(上底+下底)×高÷2
第三篇:數控機床知識點期末總結
數控機床是由信息輸入,數控裝置,伺服驅動裝置及檢測反饋裝置 2 分類:1)按工藝用途:金屬切削類數控機床金屬成形類及特種加工類數控機床
4數控機床的精度指標包括:定位精度和重復定位精度,分辨率與脈沖當量,分度精度定位誤差影響加工零件的尺寸精度。重復定位誤差影響批量加工零件的一致性。5
6常用的主軸軸承:滾動軸承和靜壓滑動軸承
8數控機床上實現直線進給運動的形式有:絲杠副,齒輪齒條副,直線電動機 10 最常用的絲杠副是滾珠絲杠
11滾珠絲杠采用雙螺母結構消除軸向間隙
12常見的雙螺母絲杠消除間隙的方法:墊片調隙式,螺紋調隙式,齒差調隙式 13常用的消除齒輪傳動間隙的方法有剛性調整法和柔性調整法
剛性調整法分為偏心套調隙、墊片調隙、斜齒輪調隙
柔性調整法分為直齒輪的調隙、斜齒輪的調隙、錐齒輪的調隙
14自動換刀裝置根據其組成結構可分為回轉刀架式、轉塔式和帶刀庫式
15帶刀庫式自動換刀裝置換刀方式:無機械手交換刀具式、機械手交換刀具式 16鏈式刀庫的優點是:結構緊湊,布局靈活,刀庫容量大,可實現“預選”,換刀時間短
17加工程序編制方法主要分為:手工編程與自動編程
18一個完整的加工程序必須有程序開始部分,若干個程序段和程序結束部分 19一個程序段是由一個或若干個指令“字”組成,指令代表某一個信息單元,一個指令“字”由地址符和數字組成,它代表機床的一個位置或一個動作;每個程序段結束處有程序段標志符,表示該程序段的結束。S和F功能指令均為模態指令加工工序劃分原則是:工序集中原則和工序分散原則順銑:切削速度V與進給速度Vf方向相同
逆銑:切削速度V與進給速度Vf方向相反從哪些方面可以衡量數控機床水平?
1)中央處理單元(CPU)
2)分辨率和進給速度
3)多軸聯動功能
4)顯示功能
5)通信功能
此外,伺服系統是直流還是交流;是交流模擬伺服還是交流數字伺服;以及可
編程序控制器功能的強弱,都是衡量數控檔次的標準什么是定位精度與重復定位精度?
定位精度:指數控機床工作臺等移動部件實際運動位置與指令位置的一致程度重復定位精度:指在相同的操作方法和條件下,多次完成規定操作后得到結果的一致程度 3 數控機床對主軸控制系統的基本要求?
1)主軸轉速高,變速范圍寬,并可實現無級變速
2)主軸傳動平穩,噪聲低,精度高
3)具有良好的抗震性和熱穩定性
4)能實現刀具的快速和自動裝卸主軸軸承配置有幾種形式?
1)雙列短圓柱滾子軸承和60°角接觸球軸承組合特點:使主軸獲交大徑向和軸向剛度,可滿足機床強力切削,普遍應用于
各類數控機床主軸,后支承也可采用圓柱滾子軸承,進一步提高后支承徑向剛度
2)前軸承采用高精度調心球軸承
特點:前支撐采用背靠背組配方式,具有良好的高速性能,但承載能力較
小,適用于高速輕載和精密數控機床
3)單列和雙列圓錐滾子軸承的組合特點:使主軸承受較重載荷(尤其是較強的動載荷),徑向和軸向剛度高,安裝和調整性好,適用于中等精度、低速與重載的數控機床主軸三種調隙方式的優缺點?
1)墊片調隙 優點:結構簡單,剛性好
缺點:調整不便,滾道有磨損時不能隨時消除間隙和進行預緊
2)螺紋調隙 優點:結構簡單,調整方便
缺點:調整精度較差
3)齒差調隙 優點:調整方便,可獲精確地調整量預緊可靠,不會松動缺點:結構較為復雜,尺寸較大滾珠絲杠的支撐有哪些形式?
1)一端固定一端自由:特點是結構簡單,軸向剛度低,適用短絲杠和垂直布置
絲杠,一般用于數控機床的調整環節和升降臺式數控銑床的垂直坐標軸
2)一端固定一端浮動:軸向剛度于1)形式相同,絲杠受熱后有伸長余地,需
保證螺母與兩支承同軸,這種配置結構復雜,工藝較困難,適用于較長的絲杠或臥式絲杠
3)兩端固定:軸向剛度越是一端固定式的4倍,固有頻率高,可預拉伸,一端
裝有碟形彈簧和調整螺母,使絲杠保持恒定預緊力,但結構和工藝復雜 7 預拉伸滾珠絲杠的目的?
采用預拉伸的方法可以減小絲杠的熱變形,這種方法是加工滾珠絲杠時,使螺距略小于名義值,裝配時對絲杠進行預拉伸,即使其螺距達到名義值,當絲杠工作受熱,絲杠中的拉應力補償了熱應力,從而減小熱伸長加工工序劃分方式有哪些?
1)按零件裝夾定位方式劃分工序
2)按加工用刀具劃分工序
3)按加工部位劃分工序
4)按粗、精加工劃分工序什么是數控加工走刀路線?
走刀路線是指加工過程中刀具相對于被加工零件的運動軌跡和方向。它不但
包括了工步的內容,也反映出工步順序,而且與零件的加工精度和表面粗糙度密切相關。確定走刀路線要考慮哪些原則?
1)使工件表面獲得所要求的的加工精度和表面粗糙度
2)應盡量減少進、退刀時間和其他輔助時間,減少空進給時間
3)選擇合理的進、退刀位置,盡量避免沿零件輪廓法向切入或進給中停頓以免
留下刀痕
4)盡量使進給路線最短,使程序段數減少,一提高加工效率
5)為保證工件輪廓表面加工后的粗糙程度要求,最終輪廓應安排在最后一次走
刀中連續加工出來
6)使到位點數值計算容易,以減少編程工作量
7)一般先加工外輪廓,再加工內輪廓,先完成對零件剛性影響小的工步,后完
成對零件剛性影響大的工步,以免工件剛性不足影響加工精度
8)要選擇工件加工變形盡可能小的路線,對橫截面積小的細長零件或薄板零件
應采用分幾次走刀加工到最后尺寸或按對稱去余量法安排走刀路線
此外,確定加工路線時,還要考慮加工工件的加工余量,機床于刀具的剛
度,保證加工過程的安全性,避免刀具于工件發生干涉等情況,以便選擇最合理的加工路線。合理的加工路線:是指能保證工件加工精度,表面粗糙度要求,數值計算簡單、程序段少、變成工作量少、加工路線最短、空行程最少的高效率路線。
第四篇:QT 學習心得
QT 學習心得體會
1:#include
2:fcntl.h文件控制,包含了open read write等等文件函數,O_RDONLY只讀方式打開文件,O_WRONLY只寫方式打開文件,O_RDWR可讀寫方式打開文件,O_NOCTTY如果欲打開的文件為終端設備時,則不會將終端機當成進程控制終端機,O_NONBLOCK以不可阻擋方式打開文件,也就是無論有無數據讀取活等待,都會立即返回進程之中。
3:unistd.h是POSIX標準定義的unix類符號常量的頭文件,包含了許多UNIX系統服務的函數原型,例如read函數、write函數和getpid函數
4:我們所用的版本是qtopia2.2 頭文件格式 #include
5:v4l2是內核提供給應用程序訪問音,視頻驅動的統一接口
6:v4l2的工作流程
打開設備->檢查和設置設備屬性->設置抮格式->設置一種輸入輸出方法->循環獲取數據->關閉設備,在對底層設備如攝像頭或串口操作時,需要調用fcntl.hunistd.h,int
fd=open(“/dev/video0”,O_RDWR),將終端設備打開,前面是設備名稱,后面為打開的方式,讀,寫,讀寫
7:ioctl是中對設備的進行管理的函數。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉速等等。它的調用個數如下:
int ioctl(int fd, int cmd, …);
其中fd就是用戶程序打開設備時使用open函數返回的文件標示符,cmd就是用戶程序對設 備的控制命令,至于后面的省略號,那是一些補充參數,一般最多一個,有或沒有是和cmd的意義相關的。
8:memset將s所指向的某一塊內存中的每個的內容全部設置為ch指定的ASCII值, 塊的大小由第三個參數指定,這個函數通常為新申請的內存做初始化工作, 其返回值為指向S的指void *memset(void *s, int ch, unsigned n);
9:由于qt designer不支持中文,所以需要編碼顯示中文,通常操作方法,添加頭文件#include
SnapButton->setText(BianMa->toUnicode(“執行”));
10:在控制水平滑動條(垂直滑動條)移動的時候,為減少畫面閃爍感,采用雙緩沖技術
11:
Qt是諾基亞開發的一個跨平臺的C++圖形用戶界面框架。它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所用功能。Qt是完全面向對象的,很容易擴展,并且允許真正地組件編程。自從 1996年早些時候,Qt進入商業領域,它已經成為全世界范圍內數千種成功的應用程序的基礎。Qt也是流行的 Linux桌面環境KDE 的基礎。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界 面庫和 Windows平臺上的 MFC,OWL,VCL,ATL 是同類型的東西,但Qt具有優良的跨平臺特性、面向對象、豐富的API、大量的開發文檔等優點。
qt是跨平臺的程序設計框架,在不同平臺上版本不同。寫好的代碼需要在什么平臺上運行,就采用那個平臺上的qt編譯器進行編譯。
qt支持嵌入式開發,qtopia是它的嵌入式版本。在主機上開發的程序,通過qtopia編譯之后,傳到嵌入式平臺上就可以運行。前提是這個平臺上已經安裝了qtopia程序的運行環境。
12:V4L2(video 4 linux 2)
程序有發現設備的能力和操作設備.它主要是用過一系列的回調函數來實現這些功能.像設置高頻頭的頻率,幀頻,視頻壓縮格式和圖像像參數等等(在我寫的FM驅動中就主要是設置頻率,設置音量等)
查詢設備屬性:VIDEOC_QUERYCAP
所以IOCTL主要用來控制I/O的屬性,可用來獲取設備信息,或用來顯示所有偵格式,獲取內存等等IO操作
int ioctl(int fd,int request,struct v4l2_capability *argp);
顯示設備信息:struct v4l2_capability cap;
ioctl(fd,VIDIOC_QUERYCAP,&cap);
printf(“Driver Name:%s”,cap.driver);
13:connect(const* sender, const char * signal, const* receiver,const char * member)[靜態]
把從sender對象發送的signal和receiver對象中的member連接起來,并且如果連接成功返回真,否則返回假,所以當Sinal和SLOT信號都在同一個頁面文件時候,sender和receiver都是this
14: BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); 該函數對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境。可以用以雙緩沖技術
15:在調用libjpeg庫之前,首先要多libjpeg的源代碼進行交叉編譯,再將庫中聲稱的部分文件拷到工作目錄下
第五篇:Qt數據庫總結
Qt數據庫總結
#include
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);采用QSQLITE數據庫,QMYSQL數據庫有問題?
db.setHostName(“localhost”);//設置數據庫主機名
db.setDatabaseName(“test”);//設置數據庫名
db.setUserName(“root”);//設置數據庫登入用戶名
db.setPassword(“123456”);//設計數據庫登入密碼
db.open()打開數據庫連接 db.close();//釋放數據庫
QStringList drivers = QSqlDatabase::drivers();//靜態成員函數,是類的成員函數,不是對象的.返回所有可用的數據庫驅動程序的清單
drivers.removeAll(“QMYSQL3”);//刪除列表中的項
foreach(QString driver, drivers)//遍歷數據庫驅動,測試數據庫驅動種類
qDebug()<< “t” << driver;建立數據庫文件
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
db.setDatabaseName(“database.db”);
if(!db.open())return false;
QSqlQuery query;query.exec(“create table Login(id INTEGER PRIMARY KEY autoincrement, ” //id會自動增加,因為這里不能重復,否則數據庫無法修改
“goods int, store int, time nvarchar(50), type int, place nvarchar(50),temperature nvarchar(10))”);
//query.exec(“insert into Login values(1,1002, 1,'2011-9-6',1,'common',24)”);
// query.exec(“insert into Login values(2,1005, 1,'2011-9-6',1,'common',24)”);
//query.exec(“insert into Login values(3,1010, 2,'2011-9-7',2,'common',25)”);//
query.exec(“insert into Login values(4,1012, 2,'2011-9-7',2,'common',25)”);
query.exec(“insert into Login values(1,NULL , NULL,NULL, NULL,NULL,NULL)”);
query.exec(“insert into Login values(2,NULL , NULL,NULL, NULL,NULL,NULL)”);
query.exec(“insert into Login values(3,NULL , NULL,NULL, NULL,NULL,NULL)”);
query.exec(“insert into Login values(4,NULL , NULL,NULL, NULL,NULL,NULL)”);
query.exec(“insert into Login values(5,NULL , NULL,NULL, NULL,NULL,NULL)”);
query.exec(“insert into Login values(6,NULL , NULL,NULL, NULL,NULL,NULL)”);
第二:QSqlQuery類,查詢數據庫,插入值到數據庫等操作數據庫
QSqlQuery query;
query.prepare(“INSERT INTO T_USER(name, age)VALUES(:name, :age)”);//準備執行SQL查詢
query.bindValue(“:name”, “justin”);//在這定占位符上確定綁定的值 query.bindValue(“:age”, 33);query.exec();
QSqlQuery query;//以下執行相關QSL語句
query.exec(“create table student(id int primary key,name varchar)”);
//新建student表,id設置為主鍵,還有一個name項
query.exec(“insert into student values(1,’xiaogang’)”);
query.exec(“insert into student values(2,’xiaoming’)”);
query.exec(“insert into student values(3,’xiaohong’)”);
//向表中插入3條記錄
query.exec(“select * from student”);
來查詢出表中所有的內容。其中的SQL語句“select * from student”中“*”號表明查詢表中記錄的所有屬性。而當query.exec(“select * from student”);這條語句執行完后,我們便獲得了相應的執行結果,因為獲得的結果可能不止一條記錄,所以我們稱之為結果集。
while(query.next())QString name = query.value(0).toString();//返回“name”字段的索引值“justin”,value(i)返回i字段的值,0表示name,1表示age int id = query.value(1).toInt();seek(int n):query指向結果集的第n條記錄。指定當前的位置 first():query指向結果集的第一條記錄。last():query指向結果集的最后一條記錄。
next():query指向下一條記錄,每執行一次該函數,便指向相鄰的下一條記錄。
previous():query指向上一條記錄,每執行一次該函數,便指向相鄰的上一條記錄。
record():獲得現在指向的記錄。
value(int n):獲得屬性的值。其中n表示你查詢的第n個屬性,比方上面我們使用“select * from student”就相當于“select id, name from student”,那么value(0)返回id屬性的值,value(1)返回name屬性的值。該函數返回QVariant類型的數據,關于該類型與其他類型的對應關系,可以在幫助中查看QVariant。
at()//返回當前查詢的位置
int fieldNo = query.record().indexOf(“name”);//返回“name”的列號
int rowNum = query.at();
//獲取query所指向的記錄在結果集中的編號
int columnNum = query.record().count();
//獲取每條記錄中屬性(即列)的個數
int fieldNo = query.record().indexOf(“name”);
//獲取”name”屬性所在列的編號,列從左向右編號,最左邊的編號為0
int id = query.value(0).toInt();
//獲取id屬性的值,并轉換為int型
QString name = query.value(fieldNo).toString();
//獲取name屬性的值
qDebug()<< “rowNum is : ” << rowNum //將結果輸出
<< ” id is : ” << id
<< ” name is : ” << name
<< ” columnNum is : ” << columnNum;
} if(query.seek(2))//seek指定當前的位置
if(query.seek(ui->spinBox->value()))
{
qDebug()<< query.value(0).toInt()<< query.value(1).toString();
while(query.next())//每執行一次該函數,便指向相鄰的下一條記錄。
{
qDebug()<< query.value(0).toInt()<< query.value(1).toString();//value(i)返回i字段的值,0表示id,1表示name
}
}
//批處理操作函數--批量插入到數據庫中
QSqlQuery q;
q.prepare(“insert into student values(?, ?)”);
QVariantList ints;
//QVariantList==QList
ints << 10 << 11 << 12 << 13;
q.addBindValue(ints);//綁定
QVariantList names;
names << “xiaoming” << “xiaoliang” << “xiaogang” << QVariant(QVariant::String);
//最后一個是空字符串,應與前面的格式相同
q.addBindValue(names);
if(!q.execBatch())//進行批處理,如果出錯就輸出錯誤
qDebug()<< q.lastError();
//事務操作--操作函數transaction(),commit()提交,rollback()回滾 事務是數據庫的一個重要功能,所謂事務是用戶定義的一個數據庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位。
在Qt中用transaction()開始一個事務操作,用commit()函數或rollback()函數進行結束。commit()表示提交,即提交事務的所有操作。
具體地說就是將事務中所有對數據庫的更新寫回到數據庫,事務正常結束。rollback()表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的所有已完成的操作全部撤銷,回滾到事務開始時的狀態。
if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions))//先判斷該數據庫是否支持事務操作。hasFeature是QSQLDriver類函數
if(QSqlDatabase::database().transaction())//啟動事務操作
QModelIndex類--用來定義數據模型中的數據
第三:QSqlQueryModel類
只讀數據模型為數據庫結果集
函數:void QSqlQueryModel::setQuery(const QString & query, const QSqlDatabase & db = QSqlDatabase()//執行訪問query從給定的數據庫db setHeaderData()
//設置水平頭標題
columnCount();//獲得列數
columnCount();//獲得列數
QSqlRecord QSqlQueryModel::record(int row)const //返回row行包含的信息
QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex())//返回指定的行和列的確定的那個索引(index)index.data()//返回index索引的值 1.QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery(“select * from student”);//查詢整個student表的內容,訪問給定的數據庫
model->setHeaderData(0, Qt::Horizontal, tr(“id”));
model->setHeaderData(1, Qt::Horizontal, tr(“name”));
QTableView *view = new QTableView;
view->setModel(model);//重新定義模型,model直接從database.db的數據庫中插入數據
view->show();2.int column = model->columnCount();//獲得列數
int row = model->rowCount();
// 獲得行數
QSqlRecord record = model->record(1);//獲得一條記錄
QModelIndex index = model->index(1,1);//獲得一條記錄的一個屬性的值
qDebug()<< “column num is:” << column << endl
<< “row num is:” << row << endl
<<“the second record is:” << record << endl
<<“the data of index(1,1)is:” << index.data();
3.QSqlQuery query = model->query();
//返回與QSqlQuery相關的模型
query.exec(“insert into student values(10,'yafei10')”);//在模型中插入一條記錄
model->setQuery(“select * from student”);//再次查詢整張表
view->show();//再次進行顯示,這句也可以不寫
4.使QSqlQueryModel類
創建的數據庫能讀寫
繼承QAbstractItemModel類
剛開始我們就講到,這個模型默認是只讀的,所以我們在窗口上并不能對表格中的內容進行修改。但是我們可以創建自己的模型,然后按照我們自己的意愿來顯示數據和修改數據。
要想使其可讀寫,需要自己的類繼承自QSqlQueryModel,并且重寫setData()和 flags()兩個函數。如果我們要改變數據的顯示,就要重寫data()函數。bool QAbstractItemModel::setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)//設置根據index索引到的value值
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index)const //返回給定的index索引的標志
QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole)const //返回index和role(顯示狀態)確定的值 Qt::ItemFlags MySqlQueryModel::flags(const QModelIndex &index)const //返回表格是否可更改的標志 {
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if(index.column()== 1)//第二個屬性可更改
flags |= Qt::ItemIsEditable;//flags能被編輯,所以第二列能被編輯
return flags;} QVariant MySqlQueryModel::data(const QModelIndex &index, int role)const
//更改數據顯示樣式 {
QVariant value = QSqlQueryModel::data(index, role);
if(role == Qt::TextColorRole && index.column()== 0)//Qt::TextColorRole是確定顏色等為9,所以與之后是第一列
return qVariantFromValue(QColor(Qt::red));//第一個屬性的字體顏色為紅色
return value;}
第四:QSqlTableModel 繼承QSqlQueryModel類--該類提供了一個可讀寫單張SQL表的可編輯數據模型,功能:修改,插入,刪除,查詢,和排序 QSqlTableModel *model = new QSqlTableModel;virtual bool removeColumns(int column, int count, const QModelIndex & parent = QModelIndex())//model->removeColumns(0)刪除第一列 bool QSqlTableModel::submitAll(),//提交所有被修改的數據,然后修改的數據被保存在數據庫中 void QSqlTableModel::revertAll()//撤銷所有的修改,但是如果數據庫已經被提交了修改,就不能通過撤銷修改改回來了
void QSqlTableModel::setFilter(const QString & filter)//篩選,按照字符串filter對數據庫進行篩選
bool QSqlTableModel::select()//在篩選和排序的條件下,將數據庫中符合要求的在mode表格中顯示出來
void QSqlTableModel::setSort(int column, Qt::SortOrder order)//排序操作。按照列和Qt::SortOrder排序。Qt::SortOrder有升序和降序 virtual void revertRow(int row)//刪除行
bool insertRow(int row, const QModelIndex & parent = QModelIndex())//插入行,也有插入列
model->setEditStrategy(QSqlTableModel::OnManualSubmit);//設置保存策略為手動提交,OnManualSubmit表明我們要提交修改才能使其生效。1.//在tableview表格中顯示數據庫數據
model = new QSqlTableModel(this);
model->setTable(“student”);//設置“student”的數據庫表格
model->setEditStrategy(QSqlTableModel::OnManualSubmit);//設置保存策略為手動提交
model->select();//選取整個表的所有行
// model->removeColumn(1);//不顯示name屬性列,如果這時添加記錄,則該屬性的值添加不上。
ui->tableView->setModel(model);//重新定義模型,model直接從database.db的數據庫中插入數據
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//使其不可編輯
2.//當tableview被修改后,要通過submitAll()函數進行保存 bool QSqlTableModel::submitAll(),提交所有被修改的數據,然后修改的數據被保存在數據庫中
model->database().transaction();//開始事務操作
if(model->submitAll()){ //提交所有被修改的數據,然后修改的數據被保存在數據庫中
model->database().commit();//提交
} else {
model->database().rollback();//回滾
QMessageBox::warning(this, tr(“tableModel”),tr(“數據庫錯誤: %1″)
.arg(model->lastError().text()));
}
model->revertAll();//撤銷修改
3.查詢操作--void QSqlTableModel::setFilter(const QString & filter)//篩選
QString name = ui->lineEdit->text();
model->setFilter(QObject::tr(“name = ‘%1′”).arg(name));//根據姓名進行篩選
model->select();//顯示結果 4.排序操作 // model->setSort(0,Qt::AscendingOrder);//id屬性,即第0列,升序排列
model->select();model->setSort(0,Qt::DescendingOrder);
model->select();5.刪除行
// int curRow = ui->tableView->currentIndex().row();
//獲取選中的行
// model->removeRow(curRow);//刪除一行
//刪除該行
QItemSelectionModel *selections = ui->tableView->selectionModel();//返回當前的選擇模式
QModelIndexList selected = selections->selectedIndexes();//返回所有選定模型項目索引列表
foreach(QModelIndex index, selected)
{
int curRow=index.row();
model->removeRow(curRow);//刪除所有被選中的行
}
int ok = QMessageBox::warning(this,tr(“刪除當前行!”),tr(“你確定”
“刪除當前行嗎?”),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();//如果不刪除,則撤銷
}
else model->submitAll();//否則提交,在數據庫中刪除該行 6.插入操作//插入行
int rowNum = model->rowCount();//獲得表的行數
int id = 10;
model->insertRow(rowNum);//添加一行
model->setData(model->index(rowNum,0),id);//給新行添加id屬性值
//model->submitAll();//可以直接提交
QSqlRelationalTableModel->Inherits QSqlTableModel->Inherits QSqlQueryModel->Inherits QAbstractTableModel->Inherits QAbstractItemModel->Inherits QObjec
第五:QSqlRelationalTableModel--該類為單張的數據庫表提供了一個可編輯的數據模型,它支持外鍵,除此之外和QSqlTableModel沒有什么不同
model->setRelation(2,QSqlRelation(“course”,”id”,”name”));//設置外鍵
//將student表的第三個屬性設為course表的id屬性的外鍵,并將其顯示為course表的name屬性的值(course表在id上顯示為name屬性值)如果用戶更改課程屬性,那么他只能在課程表中有的課程中進行選擇,而不能隨意填寫課程。在Qt中的QSqlRelationalDelegate委托類就能實現這個功能 ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));QSqlRelationalDelegate類--提供委托delegate用來顯示編輯QSqlRelationalTableModel類 QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));
QDataWidgetMapper類可以將數據庫和控件(如QLineEdit)連接起來,使控件得到數據庫的值(例子:editEmployees)
第六:QTableView、QListView、QTreeView和QSqlite