setInterval(函數(shù)名,1000); t: Timer = new Timer(1000, 5); t.addEventListener(TimerEvent.TIMER,函數(shù)名); t.addEventListener(TimerEvent.TIMER_COMPLETE, 函數(shù)名); t.start();
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)涇縣,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
qt可以實(shí)現(xiàn)連接各種數(shù)據(jù)庫(kù),這里介紹qt自帶的一種數(shù)據(jù)庫(kù)(Qsqlite)#include#include#include#include#include#include#includestaticboolcreateConnection(){QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("mytest.db");if(!db.open())returnfalse;QSqlQueryquery;//query.exec(QObject::tr("createtablestudent(idintprimarykey,namevchar)"));//query.exec(QObject::tr("insertintostudentvalues(0,'劉')"));////query.exec(QObject::tr("insertintostudentvalues(1,'剛')"));//query.exec(QObject::tr("insertintostudentvalues(2,'紅')"));//query.prepare("insertintostudentvalues(?,?)");//-------------------------------------------------------//通過下面這段代碼可以實(shí)現(xiàn)向數(shù)據(jù)庫(kù)插入變量//--------------------------------------------------------QVariantListages;intx1,x2,x3,x4;x1=12;x2=13;x3=14;x4=15;ages
在工程文件中,在QT +=coregui的下一行添加QT +=sql,即可
如果還有問題的話,你可以繼續(xù)問我,我最近也在qt編程,希望能夠得到你的好評(píng)!
Qt 提供了 QtSql 模塊來提供平臺(tái)獨(dú)立的基于 SQL 的數(shù)據(jù)庫(kù)操作。這里我們所說的“平臺(tái)獨(dú)立”,既包括操作系統(tǒng)平臺(tái),有包括各個(gè)數(shù)據(jù)庫(kù)平臺(tái)。另外,我們強(qiáng)調(diào)了“基于 SQL”,因?yàn)?NoSQL 數(shù)據(jù)庫(kù)至今沒有一個(gè)通用查詢方法,所以不可能提供一種通用的 NoSQL 數(shù)據(jù)庫(kù)的操作。Qt 的數(shù)據(jù)庫(kù)操作還可以很方便的與 model/view 架構(gòu)進(jìn)行整合。通常來說,我們對(duì)數(shù)據(jù)庫(kù)的操作更多地在于對(duì)數(shù)據(jù)庫(kù)表的操作,而這正是 model/view 架構(gòu)的長(zhǎng)項(xiàng)。
Qt 使用QSqlDatabase表示一個(gè)數(shù)據(jù)庫(kù)連接。更底層上,Qt 使用驅(qū)動(dòng)(drivers)來與不同的數(shù)據(jù)庫(kù) API 進(jìn)行交互。Qt 桌面版本提供了如下幾種驅(qū)動(dòng):
驅(qū)動(dòng) 數(shù)據(jù)庫(kù)
QDB2 IBM DB2 (7.1 或更新版本)
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity (ODBC) – Microsoft SQL Server 及其它兼容 ODBC 的數(shù)據(jù)庫(kù)
QPSQL PostgreSQL (7.3 或更新版本)
QSQLITE2 SQLite 2
QSQLITE SQLite 3
QSYMSQL 針對(duì) Symbian 平臺(tái)的SQLite 3
QTDS Sybase Adaptive Server (自 Qt 4.7 起廢除)
不過,由于受到協(xié)議的限制,Qt 開源版本并沒有提供上面所有驅(qū)動(dòng)的二進(jìn)制版本,而僅僅以源代碼的形式提供。通常,Qt 只默認(rèn)搭載 QSqlite 驅(qū)動(dòng)(這個(gè)驅(qū)動(dòng)實(shí)際還包括 Sqlite 數(shù)據(jù)庫(kù),也就是說,如果需要使用 Sqlite 的話,只需要該驅(qū)動(dòng)即可)。我們可以選擇把這些驅(qū)動(dòng)作為 Qt 的一部分進(jìn)行編譯,也可以當(dāng)作插件編譯。
如果習(xí)慣于使用 SQL 語句,我們可以選擇QSqlQuery類;如果只需要使用高層次的數(shù)據(jù)庫(kù)接口(不關(guān)心 SQL 語法),我們可以選擇QSqlTableModel和QSqlRelationalTableModel。我們只介紹QSqlQuery類的使用。
在使用時(shí),我們可以通過
QSqlDatabase::drivers();
1
找到系統(tǒng)中所有可用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的名字列表。我們只能使用出現(xiàn)在列表中的驅(qū)動(dòng)。由于默認(rèn)情況下,QtSql 是作為 Qt 的一個(gè)模塊提供的。為了使用有關(guān)數(shù)據(jù)庫(kù)的類,我們必須早 .pro 文件中添加這么一句:
QT += sql
1
這表示,我們的程序需要使用 Qt 的 core、gui 以及 sql 三個(gè)模塊。注意,如果需要同時(shí)使用 Qt4 和 Qt5 編譯程序,通常我們的 .pro 文件是這樣的:
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
1
2
這兩句也很明確:Qt 需要加載 core、gui 和 sql 三個(gè)模塊,如果主板本大于 4,則再添加 widgets 模塊。
下面來看一個(gè)簡(jiǎn)單的函數(shù):
bool connect(const QString dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// db.setHostName("host");
// db.setDatabaseName("dbname");
// db.setUserName("username");
// db.setPassword("password");
db.setDatabaseName(dbName);
if (!db.open()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我們使用connect()函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接。我們使用QSqlDatabase::addDatabase()靜態(tài)函數(shù)完成這一請(qǐng)求,也就是創(chuàng)建了一個(gè)QSqlDatabase實(shí)例。注意,數(shù)據(jù)庫(kù)連接使用自己的名字進(jìn)行區(qū)分,而不是數(shù)據(jù)庫(kù)的名字。例如,我們可以使用下面的語句:
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE", QString("con%1").arg(dbName));
1
此時(shí),我們是使用addDatabase()函數(shù)的第二個(gè)參數(shù)來給這個(gè)數(shù)據(jù)庫(kù)連接一個(gè)名字。在這個(gè)例子中,用于區(qū)分這個(gè)數(shù)據(jù)庫(kù)連接的名字是QString(“conn%1”).arg(dbName),而不是 “QSQLITE”。這個(gè)參數(shù)是可選的,如果不指定,系統(tǒng)會(huì)給出一個(gè)默認(rèn)的名字QSqlDatabase::defaultConnection,此時(shí),Qt 會(huì)創(chuàng)建一個(gè)默認(rèn)的連接。如果你給出的名字與已存在的名字相同,新的連接會(huì)替換掉已有的連接。通過這種設(shè)計(jì),我們可以為一個(gè)數(shù)據(jù)庫(kù)建立多個(gè)連接。
我們這里使用的是 sqlite 數(shù)據(jù)庫(kù),只需要指定數(shù)據(jù)庫(kù)名字即可。如果是數(shù)據(jù)庫(kù)服務(wù)器,比如 MySQL,我們還需要指定主機(jī)名、端口號(hào)、用戶名和密碼,這些語句使用注釋進(jìn)行了簡(jiǎn)單的說明。
接下來我們調(diào)用了QSqlDatabase::open()函數(shù),打開這個(gè)數(shù)據(jù)庫(kù)連接。通過檢查open()函數(shù)的返回值,我們可以判斷數(shù)據(jù)庫(kù)是不是正確打開。
QtSql 模塊中的類大多具有l(wèi)astError()函數(shù),用于檢查最新出現(xiàn)的錯(cuò)誤。如果你發(fā)現(xiàn)數(shù)據(jù)庫(kù)操作有任何問題,應(yīng)該使用這個(gè)函數(shù)進(jìn)行錯(cuò)誤的檢查。這一點(diǎn)我們也在上面的代碼中進(jìn)行了體現(xiàn)。當(dāng)然,這只是最簡(jiǎn)單的實(shí)現(xiàn),一般來說,更好的設(shè)計(jì)是,不要在數(shù)據(jù)庫(kù)操作中混雜界面代碼(并且將這個(gè)connect()函數(shù)放在一個(gè)專門的數(shù)據(jù)庫(kù)操作類中)。
接下來我們可以在main()函數(shù)中使用這個(gè)connect()函數(shù):
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (connect("demo.db")) {
QSqlQuery query;
if (!query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VARCHAR,"
"age INT)")) {
QMessageBox::critical(0, QObject::tr("Database Error"),
query.lastError().text());
return 1;
}
} else {
return 1;
}
return a.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main()函數(shù)中,我們調(diào)用這個(gè)connect()函數(shù)打開數(shù)據(jù)庫(kù)。如果打開成功,我們通過一個(gè)QSqlQuery實(shí)例執(zhí)行了 SQL 語句,就是query.exec();。同樣,我們使用其lastError()函數(shù)檢查了執(zhí)行結(jié)果是否正確。
注意這里的QSqlQuery實(shí)例的創(chuàng)建。我們并沒有指定是為哪一個(gè)數(shù)據(jù)庫(kù)連接創(chuàng)建查詢對(duì)象,此時(shí),系統(tǒng)會(huì)使用默認(rèn)的連接,也就是使用沒有第二個(gè)參數(shù)的addDatabase()函數(shù)創(chuàng)建的那個(gè)連接(其實(shí)就是名字為QSqlDatabase::defaultConnection的默認(rèn)連接)。如果沒有這么一個(gè)連接,系統(tǒng)就會(huì)報(bào)錯(cuò)。也就是說,如果沒有默認(rèn)連接,我們?cè)趧?chuàng)建QSqlQuery對(duì)象時(shí)必須指明是哪一個(gè)QSqlDatabase對(duì)象,也就是addDatabase()的返回值。
我們還可以通過使用QSqlQuery::isActive()函數(shù)檢查語句執(zhí)行正確與否。如果QSqlQuery對(duì)象是活動(dòng)的,該函數(shù)返回 true。所謂“活動(dòng)”,就是指該對(duì)象成功執(zhí)行了exec()函數(shù),但是還沒有完成。如果需要設(shè)置為不活動(dòng)的,可以使用finish()或者clear()函數(shù),或者直接釋放掉這個(gè)QSqlQuery對(duì)象。這里需要注意的是,如果存在一個(gè)活動(dòng)的 SELECT 語句,某些數(shù)據(jù)庫(kù)系統(tǒng)不能成功完成connect()或者rollback()函數(shù)的調(diào)用。此時(shí),我們必須首先將活動(dòng)的 SELECT 語句設(shè)置成不活動(dòng)的。
創(chuàng)建過數(shù)據(jù)庫(kù)表 student 之后,我們開始插入數(shù)據(jù),然后將其獨(dú)取出來:
if (connect("demo.db")) {
QSqlQuery query;
query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
QVariantList names;
names "Tom" "Jack" "Jane" "Jerry";
query.addBindValue(names);
QVariantList ages;
ages 20 23 22 25;
query.addBindValue(ages);
if (!query.execBatch()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
query.lastError().text());
}
query.finish();
query.exec("SELECT name, age FROM student");
while (query.next()) {
QString name = query.value(0).toString();
int age = query.value(1).toInt();
qDebug() name ": " age;
}
} else {
return 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
依舊連接到我們創(chuàng)建的 demo.db 數(shù)據(jù)庫(kù)。我們需要插入多條數(shù)據(jù),此時(shí)可以使用QSqlQuery::exec()函數(shù)一條一條插入數(shù)據(jù),但是這里我們選擇了另外一種方法:批量執(zhí)行。首先,我們使用QSqlQuery::prepare()函數(shù)對(duì)這條 SQL 語句進(jìn)行預(yù)處理,問號(hào) ? 相當(dāng)于占位符,預(yù)示著以后我們可以使用實(shí)際數(shù)據(jù)替換這些位置。簡(jiǎn)單說明一下,預(yù)處理是數(shù)據(jù)庫(kù)提供的一種特性,它會(huì)將 SQL 語句進(jìn)行編譯,性能和安全性都要優(yōu)于普通的 SQL 處理。在上面的代碼中,我們使用一個(gè)字符串列表 names 替換掉第一個(gè)問號(hào)的位置,一個(gè)整型列表 ages 替換掉第二個(gè)問號(hào)的位置,利用QSqlQuery::addBindValue()我們將實(shí)際數(shù)據(jù)綁定到這個(gè)預(yù)處理的 SQL 語句上。需要注意的是,names 和 ages 這兩個(gè)列表里面的數(shù)據(jù)需要一一對(duì)應(yīng)。然后我們調(diào)用QSqlQuery::execBatch()批量執(zhí)行 SQL,之后結(jié)束該對(duì)象。這樣,插入操作便完成了。
另外說明一點(diǎn),我們這里使用了 ODBC 風(fēng)格的 ? 占位符,同樣,我們也可以使用 Oracle 風(fēng)格的占位符:
query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");
1
此時(shí),我們就需要使用
query.bindValue(":name", names);
query.bindValue(":age", ages);
1
2
進(jìn)行綁定。Oracle 風(fēng)格的綁定最大的好處是,綁定的名字和值很清晰,與順序無關(guān)。但是這里需要注意,bindValue()函數(shù)只能綁定一個(gè)位置。比如
query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");
// ...
query.bindValue(":name", name);
1
2
3
只能綁定第一個(gè) :name 占位符,不能綁定到第二個(gè)。
接下來我們依舊使用同一個(gè)查詢對(duì)象執(zhí)行一個(gè) SELECT 語句。如果存在查詢結(jié)果,QSqlQuery::next()會(huì)返回 true,直到到達(dá)結(jié)果最末,返回 false,說明遍歷結(jié)束。我們利用這一點(diǎn),使用 while 循環(huán)即可遍歷查詢結(jié)果。使用QSqlQuery::value()函數(shù)即可按照 SELECT 語句的字段順序獲取到對(duì)應(yīng)的數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)。
對(duì)于數(shù)據(jù)庫(kù)事務(wù)的操作,我們可以使用 QSqlDatabase::transaction() 開啟事務(wù),QSqlDatabase::commit() 或者QSqlDatabase::rollback() 結(jié)束事務(wù)。使用QSqlDatabase::database()函數(shù)則可以根據(jù)名字獲取所需要的數(shù)據(jù)庫(kù)連接。
當(dāng)進(jìn)入解壓好的源碼包后,使用./configure –help命令,可以獲得相應(yīng)幫助,那我們只要選取參數(shù)部分看看-release 這個(gè)參數(shù)顯而易見,就是編譯Qt以發(fā)布版的模式進(jìn)行,一般來說,最后系統(tǒng)完成后,庫(kù)就應(yīng)該是發(fā)布版。 -release 與上面對(duì)應(yīng),自然是調(diào)試版了,如果開發(fā)的話,可以選擇它吧。 -debug-and-release 囧,上面那兩個(gè)的兒子。 -developer-build 囧,我錯(cuò)了,開發(fā)者也可以用這個(gè)的,選了這個(gè)后,可以進(jìn)行自動(dòng)測(cè)試,不過還沒去用過,以后可以研究研究。 -opensource -commercial 這兩個(gè)參數(shù)是指是編譯是商業(yè)版本的,還是開源版本呢,視個(gè)人情況而定。 -shared -static 這兩個(gè)參數(shù)是指Qt的lib以動(dòng)態(tài)還是靜態(tài)編譯生成,這自然也是視個(gè)人需要的。 -no-fast -fast 這兩個(gè)就很有關(guān)系,如果對(duì)自己的電腦性能很有信心,那就選第一個(gè),那所有的工程文件都會(huì)生成到makefiles中,那編譯的時(shí)間,估計(jì)可以看完變形金剛了。如果選第二個(gè),那就加入子目錄和庫(kù)到makefiles,這樣就能加快編譯的速度。 -no-largefile -largefile 顧名思義,支不支持大文件,一般來說,嵌入式里是不會(huì)有從超過4G的大文件的,那就選第一個(gè)吧。 -no-exceptions -exceptions 計(jì)算機(jī)英語夠好的人都該懂,這個(gè)自然就是異常情況,選則編譯器支持拋出異常,否則不支持。 -no-accessibility -accessibility 可訪問性的支持,說實(shí)話,這個(gè)我真不知道有什么有用了。等哪天發(fā)現(xiàn)了,再來好好解釋。 -no-stl -stl 是都加入stl的支持,stl,這應(yīng)該算是C++程序員應(yīng)該都了解了,再不濟(jì),那也總聽說過大名吧。 no-sql-driver -qt-sql-driver -plugin-sql-driver 這 個(gè)可要好好說明下,一般來說,對(duì)于一個(gè)優(yōu)秀的項(xiàng)目開發(fā),數(shù)據(jù)庫(kù)是必不可少的,qt也自帶了大多數(shù)數(shù)據(jù)庫(kù)驅(qū)動(dòng),可以完美地支持?jǐn)?shù)據(jù)庫(kù)的使用。對(duì)于數(shù) 據(jù)庫(kù)的使用,我們可以直接qt驅(qū)動(dòng)編譯進(jìn)去,或者以插件的形式編譯進(jìn)去。一般來說,最簡(jiǎn)單地就是直接編譯進(jìn)去,但使用插件形式的可以更加靈活,針對(duì)不同的 需求將驅(qū)動(dòng)插件添加。其中,代表的是驅(qū)動(dòng)名,如果我想直接添加sqlite的支持話,形式如下:-qt-sql-sqlite。其他名稱 可以自己查看參數(shù)里,有詳細(xì)地介紹。 -system-sqlite sqlite真受歡迎啊,當(dāng)然那么優(yōu)秀的嵌入式數(shù)據(jù)庫(kù),本人也是基本使用它來進(jìn)行開發(fā)。這個(gè)參數(shù)意思是使用操作系統(tǒng)上的sqlite數(shù)據(jù)庫(kù),如果是不太會(huì)移植的,可以考慮直接使用qt自帶的驅(qū)動(dòng)。 -no-qt3support -qt3support 這個(gè)也是簡(jiǎn)潔易懂,加不加對(duì)qt3的支持。 no-xmlpatterns -xmlpatterns 選擇對(duì)xml的支持,如果對(duì)網(wǎng)絡(luò)無需求的話,就不用加了。 -no-phonon -phonon phonon是qt中處理多媒體的模塊,比如放放視頻什么來著,不過本人從沒用過,也是根據(jù)需要選擇的。 -no-phonon-backend -phonon-backend 與上面類似,只不過這兩是以插件的形式加入支持。 -no-svg -svg 是否加入svg的支持,svg即可縮放矢量圖形。 -no-webkit -webkit 是否加入webkit的支持,這可是個(gè)好東西,不過如果跟網(wǎng)絡(luò)不搭界的話,還是不支持吧。 -no-scripttools -scripttools 是否加入腳本工具的支持,這對(duì)php等腳本工程師來說是個(gè)很棒的參數(shù),但對(duì)于我這樣菜鳥,就別提了。 -platform target 目標(biāo)平臺(tái),這可是關(guān)鍵了,如果不注意的話,編譯出來是x86上的話,哪怕是再牛的嵌入式工程師來也沒法幫你移植到開發(fā)板上。通常,本人是linux-arm-g++。 -no-mmx -no-3dnow -no-sse -no-sse2 這四個(gè)參數(shù)是針對(duì)CPU的指令集,老實(shí)說,我也不甚了解,不過,對(duì)于開發(fā)并不是影響很大。 -qtnamespace 把qt的庫(kù)封裝到命名空間,沒啥重要用處,依個(gè)人愛好加吧。 -qtlibinfix 將所有的qt的.so庫(kù)重命名,也沒啥大用處。 -no-sql-driver -qt-sql-driver -plugin-sql-driver -system-sqlite 這是相當(dāng)明顯的,如果這都看不出來,,囧,那您一定比我近視(本人800度近視。。) 就 是說如果是-no-XX-,就說明編譯時(shí)不選擇這個(gè)參數(shù),如過是-qt-XX-,說明我們可以編譯直接選用qt自帶的驅(qū)動(dòng),如果是 -plugin-XX-,就是將驅(qū)動(dòng)以插件形式編譯,而-system-XXX,當(dāng)然是使用操作系統(tǒng)提供的驅(qū)動(dòng),不過那就需要您自己移植了,而且有時(shí)還要 用第三方的API,就方便來說非常麻煩,但是不排除您是牛人要好好玩玩的情況。 接下來,我們接著研究配置參數(shù)。 -qt-zlib -system-zlib 想 必經(jīng)過上面的講解,參數(shù)的意思已經(jīng)很快得知,就是選擇qt帶的zlib庫(kù)還是系統(tǒng)的zlib。zlib庫(kù)是用于文件和資料壓縮的庫(kù),對(duì)于新入嵌入式的人來 說,可能并無太大的用處,但是在以后的實(shí)際開發(fā)中,特別是對(duì)于多媒體圖像圖形的工程師來說,就肯定用到,因?yàn)閳D形圖像的壓縮都要使用或涉及到這個(gè)庫(kù)。 -no-gif -qt-gif 這是選擇gif的支持,如果選擇qt支持的話,那在用qt開發(fā)的項(xiàng)目中,就能顯示gif圖,gif也是比較普遍的圖片格式了,英文全稱是Graphics Interchange Format。 -no-libtiff -qt-libtiff -system-libtiff tiff是一種非常復(fù)雜的光柵圖像格式,并且有直接現(xiàn)成的C語言實(shí)現(xiàn)庫(kù),因此選擇參數(shù)時(shí)就有了qt和system,一般來說,科學(xué)相關(guān)的開發(fā)里可能會(huì)用到。 -no-libpng -qt-libpng -system-libpng png的相關(guān)參數(shù),一種非失真性壓縮位圖圖形文件格式,其實(shí)就是為了替代gif搞出來的,也是隨實(shí)際需要來選擇,當(dāng)然,也有C語言實(shí)現(xiàn)的庫(kù)。 -no-libmng -qt-libmng -system-libmng 大汗,大汗,這可是超級(jí)罕見的東西,QT竟然也能支持,說實(shí)話,這個(gè)參數(shù)我看來就是無視的。MNG是多幀PNG動(dòng)畫格式,結(jié)構(gòu)極其復(fù)雜,基本沒人用。 -no-libjpeg -qt-libjpeg -system-libjpeg jpeg,這么有名的圖片格式也不用說了,隨需要選擇吧。 -no-openssl -openssl -openssl-linked SSL,Security Socket Layer,是一個(gè)安全傳輸協(xié)議,在Internet網(wǎng)上進(jìn)行數(shù)據(jù)保護(hù)和身份確認(rèn),而OpenSSL是一個(gè)開放源代碼的實(shí)現(xiàn)了SSL及相關(guān)加密技術(shù)的軟件 包,在qt中,我們可以選擇直接支持,或者OpenSSL鏈接支持,這個(gè)參數(shù)也是為有需要者提供的。 以上是第三方庫(kù)的參數(shù)選擇,緊接著就是qt附加參數(shù),在附加參數(shù)里,我們可以指定編譯的部分及加入?yún)?shù)來獲取信息。 -make -nomake 一 句話,說明,就說我可以這兩個(gè)參數(shù)選擇哪些我要編譯,哪些我不需要,在 libs tools examples demos docs translations這些里你可以選擇,比如examples,并不重要,可以放在-nomake后,這樣編譯過程中就不會(huì)編譯這部分了。通過適當(dāng)?shù)?選擇,我們可以大大加快編譯的速度,這對(duì)配置較差的機(jī)子來說有著積極意義。 -R string -l string 這兩個(gè)參數(shù)是為編譯時(shí)增加一個(gè)庫(kù)的運(yùn)行路徑及頭文件的路徑,比如使用tslib作為開發(fā)觸摸驅(qū)動(dòng)時(shí),我們就應(yīng)使用這兩個(gè)參數(shù)來指定tslib的庫(kù)路徑和頭文件路徑。 -no-rpath -rpath 這個(gè)參數(shù)比較難于理解,簡(jiǎn)單地說,就是告訴動(dòng)態(tài)加載器,到-rpath指定的目錄中尋找編譯時(shí)須要的動(dòng)態(tài)鏈接庫(kù),語法就與上面的參數(shù)結(jié)合,比如 -rpath -R/home/xxxx。 -continue 這個(gè)參數(shù)的作用就是當(dāng)出現(xiàn)錯(cuò)誤時(shí)依然進(jìn)行配置編譯,換我是不會(huì)加上的。 -verbose, -v 這個(gè)參數(shù)就很眼熟,在前面的文章中有過詳細(xì)介紹,簡(jiǎn)言之,就是顯示配置的每一步的具體信息。 -no-optimized-qmake -optimized-qmake 是否編譯生成優(yōu)化過的qmake,沒啥大用,也屬于可有可無的參數(shù)。 -no-nis -nis 是否編譯NIS支持,NIS(網(wǎng)絡(luò)信息服務(wù))是一個(gè)提供目錄服務(wù)的RPC(遠(yuǎn)程過程調(diào)用)應(yīng)用服務(wù),當(dāng)然沒網(wǎng)絡(luò)需要的可以再次華麗地?zé)o視。 -no-cups -cups 是 否編譯CUPS支持,是不是想問什么用啊?~~~~囧,開打印店用的。好了,不說冷笑話,CUPS給Unix/Linux用戶提供了一種可靠有效 的方法來管理打印。它支持IPP,并提供了LPD,SMB(服務(wù)消息塊,如配置為微軟WINDOWS的打印機(jī))、JetDirect等接口。CUPS還可 以瀏覽網(wǎng)絡(luò)打印機(jī)。它的開發(fā)提供者是大名鼎鼎的“水果生產(chǎn)商”----蘋果公司。 -no-iconv -iconv 選擇是否編譯iconv支持,iconv是一個(gè)計(jì)算機(jī)程序以及一套應(yīng)用程序編程接口的名稱。它的作用是在多種國(guó)際編碼格式之間進(jìn)行文本內(nèi)碼的轉(zhuǎn)換。這對(duì)跨語言Qt開發(fā)人員來說是很有用的,當(dāng)然,考慮到中文的編碼,我也選擇加入支持。 -no-pch -pch 是 否支持預(yù)編譯過的頭文件。預(yù)編譯頭就是把一個(gè)工程中的一部分代碼,預(yù)先編譯好放在一個(gè)文件里(通常以.pch為擴(kuò)展名),這個(gè)文件就稱為預(yù)編譯頭 文件。這些預(yù)先編譯好的代碼在工程開發(fā)的過程中不會(huì)被經(jīng)常改變。如果這些代碼被修改,則需要重新編譯生成預(yù)編譯頭文件。媽媽經(jīng)常說:不懂就要學(xué)。我說:不 懂就加上。。。 no-dbus -dbus -dbus-linked 是否編譯編譯QtDBus模塊。dbus是freedesktop下開源的Linux IPC通信機(jī)制,本身Linux 的IPC通信機(jī)制包括,管道(fifo),共享內(nèi)存,信號(hào)量,消息隊(duì)列,Socket等。在Qt中DBUS是有單獨(dú)的模塊的,可見其重要性。-reduce-relocations 對(duì)于額外的庫(kù)鏈接器優(yōu)化,可以減少編譯中的再定位。 no-separate-debug-info -separate-debug-info 是否存儲(chǔ)debug信息在.debug,一般為了查錯(cuò),還是選擇存儲(chǔ)吧。 -xplatform target 相當(dāng)淺顯的參數(shù),即交叉編譯的目標(biāo)平臺(tái),一般來說根據(jù)你所要移植的目標(biāo)板來確定。 -no-feature-feature -feature-feature 選 取qte的feature編譯,對(duì)于這個(gè),我理解為特性,特性的描述你可以參考src/corelib/global/qfeatures.txt,在這 里面對(duì)于每個(gè)特性都有比較充分的講解。對(duì)于特性地選擇,也是要根據(jù)開發(fā)需求進(jìn)行,如果裁剪適當(dāng),能大大為qte庫(kù)瘦身。 -embedded arch 嵌入式平臺(tái)架構(gòu)選擇,可以選擇arm,mips,x86及generic,視你的目標(biāo)平臺(tái)決定吧。 -armfpa -no-armfpa 這個(gè)參數(shù)也只是針對(duì)ARM平臺(tái)的,是否加入對(duì)于基于ARM的浮點(diǎn)數(shù)格式的支持,通常,這個(gè)參數(shù)在編譯時(shí)會(huì)自動(dòng)選擇。 -little-endian -big-endian 目標(biāo)平臺(tái)的大端和小端選擇,這應(yīng)該是常識(shí)了,如果這不知道,就不要來混嵌入式了 -host-little-endian -host-big-endia 主機(jī)平臺(tái)的大端和小端選擇,屬于雞肋的參數(shù),不選擇也會(huì)在配置時(shí)自動(dòng)選擇。 -no-freetype -qt-freetype -system-freetype 選擇freetype,F(xiàn)reeType庫(kù)是一個(gè)完全免費(fèi)(開源)的、高質(zhì)量的且可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件,在嵌入式開發(fā)中,有套可使用的字體對(duì)于中文開發(fā)至關(guān)重要,本人一般使用文泉驛字體。 -qconfig local 使用本地的qconfig配置文件來替代全部參數(shù)配置,有需要的可以去研究下,可以裁剪控件級(jí)別的參數(shù)。 -depths list 顯示的像素位深,也是根據(jù)需要來進(jìn)行吧。 -qt-decoration-style -plugin-decoration-style -no-decoration-style 這個(gè)是選擇qt的樣式風(fēng)格,對(duì)于需要美化界面的項(xiàng)目來說,可以好好選擇下。 -no-opengl -opengl api 是否加入opengl的支持,OpenGL是個(gè)專業(yè)的3D程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層3D圖形庫(kù)。不過對(duì)于一般的開發(fā)來說,似乎有很少用到的地方。 -qt-gfx-driver -plugin-gfx-driver -no-gfx-driver 這個(gè)是相當(dāng)重要的一個(gè)參數(shù),選擇QtGui的圖形顯示驅(qū)動(dòng),比如我們?cè)趐c上使用qvfb模擬時(shí),就應(yīng)該加入對(duì)qfvb的支持。我們可以在 linuxfb,transformed,qvfb,vnc,multiscreen這幾個(gè)中選擇。在平常的開發(fā)板上,選擇linuxfb即可。 -qt-kbd-driver -plugin-kbd-driver -no-kbd-driver 選擇鍵盤的驅(qū)動(dòng)支持,可以支持usb鍵盤,串口鍵盤等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中選擇。 qt-mouse-driver -plugin-mouse-driver -no-mouse-driver 鼠標(biāo)的驅(qū)動(dòng)支持,一般都會(huì)選擇tslib,可以完美地支持觸摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中選擇吧。 -iwmmxt 加入iWMMXt指令的編譯,也只是部分XScale架構(gòu)才具有。 -no-glib -glib 是否加入glib庫(kù)的支持,glib庫(kù)對(duì)應(yīng)即gtk庫(kù),就也是說加入后可以使用gtk。
1. 確定QT編譯時(shí)已經(jīng)編譯了QtSql。(默認(rèn)的qt5,都已經(jīng)支持了,如下目錄:C:\Qt\Qt5.3.0\5.3\msvc2013_opengl\plugins\sqldrivers里有相應(yīng)的驅(qū)動(dòng)動(dòng)態(tài)庫(kù)
也可以通過如下代碼測(cè)試qt5是否支持SqlServer
#include QApplication
#include QSqlDatabase
#include QStringList
#include QDebug
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
qDebug() "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) //列出Qt5所有支持的數(shù)據(jù)庫(kù)類型
qDebug() "\t" driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() "ODBC driver valid?" db.isValid(); //true為支持
}
輸出結(jié)果如下:
"QSQLITE""QMYSQL""QMYSQL3""QODBC""QODBC3""QPSQL""QPSQL7"ODBC driver valid? true
2. 若是沒有編譯,可以手動(dòng)編譯了qt的ODBC插件。
可以通過編譯qt的時(shí)候加上 configure -plugin-sql-odbc來保證,也可以單獨(dú)編譯qt安裝包里的~\src\plugins\sqldrivers\odbcqmake -t vclib odbc.pronmake (注:windows中為mingw32-make)編譯后,在~\plugins\sqldrivers\下應(yīng)該有qsqlodbcd4.dll(debug)或qsqlodbc4.dll
此時(shí),可以用下面的程序,測(cè)試一下你的QT目前支持哪些數(shù)據(jù)庫(kù)訪問。
二、連接SQLServer
要注意的就是連接數(shù)據(jù)庫(kù)時(shí)使用的數(shù)據(jù)庫(kù)名,sqlserver和sqlite、mysql等是不同的,并不是直接寫入數(shù)據(jù)庫(kù)名稱。 而是DSN名。 如果你已經(jīng)設(shè)置好了DSN,可以直接輸入DSN名。 如果沒有,可以采用DSN連接字符串直接連接ODBC數(shù)據(jù)庫(kù)。
1、直接設(shè)定DSN的字符串連接數(shù)據(jù)庫(kù),很簡(jiǎn)單。
/**
*函數(shù)介紹:創(chuàng)建數(shù)據(jù)庫(kù)連接
*輸入?yún)?shù):
*返回值:無
*/
bool DataAccess::createConnection()
{
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() "\t" driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() "ODBC driver valid?" db.isValid();
// 注意,對(duì)于express版本數(shù)據(jù)庫(kù), 一定要加\\sqlexpress這種后綴 SERVER=58.67.161.109\\sqlexpress
QString dsn = "DRIVER={SQL SERVER};SERVER=58.67.161.109;DATABASE=RDBS;UID=RDBS_USER;PWD=RDBS_USER_7010387;";
db.setHostName("58.67.161.109"); //數(shù)據(jù)庫(kù)服務(wù)器,我這里不需要
//即使dsn中已經(jīng)設(shè)置了UID和PASSWD,仍然需要執(zhí)行setUserName和setPassword的步驟
//還要注意這里的用戶名要有創(chuàng)建表的權(quán)限,不然創(chuàng)建下面的表student會(huì)不成功。
db.setDatabaseName(dsn); //數(shù)據(jù)庫(kù)名
db.setUserName("RDBS_USER");//登錄名,我再dsn里設(shè)置UID和PWD后,就不需要設(shè)置了
db.setPassword("RDBS_USER_7010387");//密碼,我再dsn里設(shè)置UID和PWD后,就不需要設(shè)置了
if(!db.open ())
{
QSqlError error = db.lastError();
QMessageBox::warning (0, "Warning", QString("Failed to open database!Error:%1").arg(error.text()));
returnfalse;
}
returntrue;
}
注意:連接數(shù)據(jù)庫(kù)時(shí), 一直連不上報(bào)錯(cuò): ConnectionOpen (Invalid Instance()) , 連接無效, 結(jié)果發(fā)現(xiàn)微軟對(duì)express版本數(shù)據(jù)庫(kù)是有限制的, 在SERVER字段添加\\sqlexpress這樣后綴, 連接OK。
2、手動(dòng)設(shè)置ODBC數(shù)據(jù)源,然后制定DSN
控制面板-系統(tǒng)和安全-管理工具-數(shù)據(jù)源(ODBC)
代碼:
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("testdsn");
db.setUserName("sa");
db.setPassword("scada");
三、下面是ODBC和OLEDB的連接字符串寫法:
1、ODBC連接字符串
//適合數(shù)據(jù)庫(kù)類型 連接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
SQLite "Driver={SQLite3 ODBC Driver};Database=D:\SQLite\*.db"
PostgreSQL "Driver={PostgreSQL ANSI};server=127.0.0.1;uid=admin;pwd=pass;database=databaseName"
2、OLEDB連接字符串
//適合的數(shù)據(jù)庫(kù)類型 連接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"