欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

包含qt使用nosql的詞條

qt怎么自動(dòng)選擇配置的define參數(shù)

當(dāng)進(jìn)入解壓好的源碼包后,使用./configure –help命令,可以獲得相應(yīng)幫助,那我們只要選取參數(shù)部分看看

創(chuàng)新互聯(lián)公司從2013年成立,先為旌陽等服務(wù)建站,旌陽等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為旌陽企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

-release

這個(gè)參數(shù)顯而易見,就是編譯Qt以發(fā)布版的模式進(jìn)行,一般來說,最后系統(tǒng)完成后,庫就應(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è),那就加入子目錄和庫到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ù)庫是必不可少的,qt也自帶了大多數(shù)數(shù)據(jù)庫驅(qū)動(dòng),可以完美地支持?jǐn)?shù)據(jù)庫的使用。對(duì)于數(shù) 據(jù)庫的使用,我們可以直接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ù)庫,本人也是基本使用它來進(jìn)行開發(fā)。這個(gè)參數(shù)意思是使用操作系統(tǒng)上的sqlite數(shù)據(jù)庫,如果是不太會(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的庫封裝到命名空間,沒啥重要用處,依個(gè)人愛好加吧。

-qtlibinfix

將所有的qt的.so庫重命名,也沒啥大用處。

-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庫還是系統(tǒng)的zlib。zlib庫是用于文件和資料壓縮的庫,對(duì)于新入嵌入式的人來 說,可能并無太大的用處,但是在以后的實(shí)際開發(fā)中,特別是對(duì)于多媒體圖像圖形的工程師來說,就肯定用到,因?yàn)閳D形圖像的壓縮都要使用或涉及到這個(gè)庫。

-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)庫,因此選擇參數(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)的庫。

-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ù)也是為有需要者提供的。

以上是第三方庫的參數(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è)庫的運(yùn)行路徑及頭文件的路徑,比如使用tslib作為開發(fā)觸摸驅(qū)動(dòng)時(shí),我們就應(yīng)使用這兩個(gè)參數(shù)來指定tslib的庫路徑和頭文件路徑。

-no-rpath

-rpath

這個(gè)參數(shù)比較難于理解,簡(jiǎn)單地說,就是告訴動(dòng)態(tài)加載器,到-rpath指定的目錄中尋找編譯時(shí)須要的動(dòng)態(tài)鏈接庫,語法就與上面的參數(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ì)于額外的庫鏈接器優(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庫瘦身。

-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庫是一個(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圖形庫。不過對(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庫的支持,glib庫對(duì)應(yīng)即gtk庫,就也是說加入后可以使用gtk。

請(qǐng)教高手如何使用QT建立SQLite數(shù)據(jù)庫啊??急!!

#include QtGui

#include QtSql

#include "scooterwindow.h"

ScooterWindow::ScooterWindow()

{

model = new QSqlTableModel(this);

model-setTable("scooter");

model-setSort(Scooter_Name, Qt::AscendingOrder);

model-setHeaderData(Scooter_Name, Qt::Horizontal, tr("Name"));

model-setHeaderData(Scooter_MaxSpeed, Qt::Horizontal, tr("MPH"));

model-setHeaderData(Scooter_MaxRange, Qt::Horizontal, tr("Miles"));

model-setHeaderData(Scooter_Weight, Qt::Horizontal, tr("Lbs"));

model-setHeaderData(Scooter_Description, Qt::Horizontal,

tr("Description"));

model-select();

view = new QTableView;

view-setModel(model);

view-setSelectionMode(QAbstractItemView::SingleSelection);

view-setSelectionBehavior(QAbstractItemView::SelectRows);

view-setColumnHidden(Scooter_Id, true);

view-resizeColumnsToContents();

view-setEditTriggers(QAbstractItemView::NoEditTriggers);

QHeaderView *header = view-horizontalHeader();

header-setStretchLastSection(true);

QHBoxLayout *mainLayout = new QHBoxLayout;

mainLayout-addWidget(view);

setLayout(mainLayout);

setWindowTitle(tr("Scooters"));

}

#ifndef SCOOTERWINDOW_H

#define SCOOTERWINDOW_H

#include QWidget

class QSqlTableModel;

class QTableView;

enum {

Scooter_Id = 0,

Scooter_Name = 1,

Scooter_MaxSpeed = 2,

Scooter_MaxRange = 3,

Scooter_Weight = 4,

Scooter_Description = 5

};

class ScooterWindow : public QWidget

{

Q_OBJECT

public:

ScooterWindow();

private:

QSqlTableModel *model;

QTableView *view;

};

#endif

#include QtGui

#include QtSql

#include "scooterwindow.h"

bool createConnection()

{

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName("scooters.dat");

if (!db.open()) {

QMessageBox::warning(0, QObject::tr("Database Error"),

db.lastError().text());

return false;

}

return true;

}

void createFakeData()

{

QSqlQuery query;

query.exec("DROP TABLE scooter");

query.exec("CREATE TABLE scooter ("

"id INTEGER PRIMARY KEY AUTOINCREMENT, "

"name VARCHAR(40) NOT NULL, "

"maxspeed INTEGER NOT NULL, "

"maxrange INTEGER NOT NULL, "

"weight INTEGER NOT NULL, "

"description VARCHAR(80) NOT NULL)");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Mod-Rad 1500', 40, 35, 298, "

"'Speedometer, odometer, battery meter, turn signal "

"indicator, locking steering column')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Rad2Go Great White E36', 22, 12, 93, "

"'10\" airless tires')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('X-Treme X360', 21, 14, 59, "

"'Cargo rack, foldable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Vego SX 600', 20, , 76, "

"'Two interchangeable batteries, foldable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Sunbird E Bike', 18, 30, 118, '')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Leopard Shark', 16, 12, 63, "

"'Battery indicator, removable seat, foldable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Vego iQ 450', 15, 0, 60, "

"'OUT OF STOCK')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('X-Treme X-11', 15, 11, 38, "

"'High powered brakes, foldable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('ZZ Cruiser', 14, 10, 46, "

"'Two batteries, removable seat')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('X-Treme X-010', 10, 10, 14, "

"'Solid tires')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Q Electric Chariot', 10, 15, 60, "

"'Foldable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('X-Treme X250', 15, 12, 0, "

"'Solid aluminum deck')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Go MotorBoard 2000X', 15, 0, 20, "

"'Foldable and carryable')");

query.exec("INSERT INTO scooter (name, maxspeed, "

"maxrange, weight, description) "

"VALUES ('Goped ESR750 Sport Electric Scooter', "

"20, 6, 45, " "'Foldable and carryable')");

}

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

bool create = !QFile::exists("scooters.dat");

if (!createConnection())

return 1;

if (create)

createFakeData();

ScooterWindow window;

window.resize(600, 500);

window.show();

return app.exec();

}

如何用Qt連接數(shù)據(jù)庫并導(dǎo)入文件?

可以使用QT自帶的數(shù)據(jù)庫完成操作,以下是參考代碼:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ? ?//添加數(shù)據(jù)庫

db.setDatabaseName("note.db"); ? ? //創(chuàng)建一個(gè)note.db的文件存儲(chǔ)數(shù)據(jù)

db.open(); ? //開啟數(shù)據(jù)庫

query = QSqlQuery(db); ?//獲得訪問數(shù)據(jù)庫的query

query.exec(XXX); ? //執(zhí)行指令(XXX為SQL指令)

db.close(); ? //關(guān)閉數(shù)據(jù)庫

一般而言會(huì)將db變量作為全局變量或者數(shù)據(jù)成員,當(dāng)需要訪問的時(shí)候就獲取一個(gè)query就可以了。

要實(shí)現(xiàn)所提到的功能,要好好看看QString、QStringList,這兩玩意主要是臨時(shí)存放數(shù)據(jù)、分割數(shù)據(jù)等作用,另外,要看QFile、QDir、QFileInfo、QTextStream,這四個(gè)主要用來讀取文本數(shù)據(jù)。看看QVector或者QList等來存放讀出來的數(shù)據(jù)。

另外,要實(shí)現(xiàn)這玩意,SQL的語句不要求精通,但是基本的Create、Insert、Select、Delete等操作要準(zhǔn)確無誤。否則出錯(cuò)了QT是看不出來的。QT不會(huì)檢測(cè)SQL的準(zhǔn)確性的。

Qt 軟件中怎么自動(dòng)加入build版本號(hào)

當(dāng)進(jìn)入解壓好的源碼包后,使用./configure –help命令,可以獲得相應(yīng)幫助,那我們只要選取參數(shù)部分看看-release 這個(gè)參數(shù)顯而易見,就是編譯Qt以發(fā)布版的模式進(jìn)行,一般來說,最后系統(tǒng)完成后,庫就應(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è),那就加入子目錄和庫到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ù)庫是必不可少的,qt也自帶了大多數(shù)數(shù)據(jù)庫驅(qū)動(dòng),可以完美地支持?jǐn)?shù)據(jù)庫的使用。對(duì)于數(shù) 據(jù)庫的使用,我們可以直接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ù)庫,本人也是基本使用它來進(jìn)行開發(fā)。這個(gè)參數(shù)意思是使用操作系統(tǒng)上的sqlite數(shù)據(jù)庫,如果是不太會(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的庫封裝到命名空間,沒啥重要用處,依個(gè)人愛好加吧。 -qtlibinfix 將所有的qt的.so庫重命名,也沒啥大用處。 -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庫還是系統(tǒng)的zlib。zlib庫是用于文件和資料壓縮的庫,對(duì)于新入嵌入式的人來 說,可能并無太大的用處,但是在以后的實(shí)際開發(fā)中,特別是對(duì)于多媒體圖像圖形的工程師來說,就肯定用到,因?yàn)閳D形圖像的壓縮都要使用或涉及到這個(gè)庫。 -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)庫,因此選擇參數(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)的庫。 -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ù)也是為有需要者提供的。 以上是第三方庫的參數(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è)庫的運(yùn)行路徑及頭文件的路徑,比如使用tslib作為開發(fā)觸摸驅(qū)動(dòng)時(shí),我們就應(yīng)使用這兩個(gè)參數(shù)來指定tslib的庫路徑和頭文件路徑。 -no-rpath -rpath 這個(gè)參數(shù)比較難于理解,簡(jiǎn)單地說,就是告訴動(dòng)態(tài)加載器,到-rpath指定的目錄中尋找編譯時(shí)須要的動(dòng)態(tài)鏈接庫,語法就與上面的參數(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ì)于額外的庫鏈接器優(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庫瘦身。 -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庫是一個(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圖形庫。不過對(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庫的支持,glib庫對(duì)應(yīng)即gtk庫,就也是說加入后可以使用gtk。

用qt怎么備份Oracle數(shù)據(jù)庫

Qt 提供了 QtSql 模塊來提供平臺(tái)獨(dú)立的基于 SQL 的數(shù)據(jù)庫操作。這里我們所說的“平臺(tái)獨(dú)立”,既包括操作系統(tǒng)平臺(tái),有包括各個(gè)數(shù)據(jù)庫平臺(tái)。另外,我們強(qiáng)調(diào)了“基于 SQL”,因?yàn)?NoSQL 數(shù)據(jù)庫至今沒有一個(gè)通用查詢方法,所以不可能提供一種通用的 NoSQL 數(shù)據(jù)庫的操作。Qt 的數(shù)據(jù)庫操作還可以很方便的與 model/view 架構(gòu)進(jìn)行整合。通常來說,我們對(duì)數(shù)據(jù)庫的操作更多地在于對(duì)數(shù)據(jù)庫表的操作,而這正是 model/view 架構(gòu)的長(zhǎng)項(xiàng)。

Qt 使用QSqlDatabase表示一個(gè)數(shù)據(jù)庫連接。更底層上,Qt 使用驅(qū)動(dòng)(drivers)來與不同的數(shù)據(jù)庫 API 進(jìn)行交互。Qt 桌面版本提供了如下幾種驅(qū)動(dòng):

驅(qū)動(dòng) 數(shù)據(jù)庫

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ù)庫

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ù)庫,也就是說,如果需要使用 Sqlite 的話,只需要該驅(qū)動(dòng)即可)。我們可以選擇把這些驅(qū)動(dòng)作為 Qt 的一部分進(jìn)行編譯,也可以當(dāng)作插件編譯。

如果習(xí)慣于使用 SQL 語句,我們可以選擇QSqlQuery類;如果只需要使用高層次的數(shù)據(jù)庫接口(不關(guān)心 SQL 語法),我們可以選擇QSqlTableModel和QSqlRelationalTableModel。我們只介紹QSqlQuery類的使用。

在使用時(shí),我們可以通過

QSqlDatabase::drivers();

1

找到系統(tǒng)中所有可用的數(shù)據(jù)庫驅(qū)動(dòng)的名字列表。我們只能使用出現(xiàn)在列表中的驅(qū)動(dòng)。由于默認(rèn)情況下,QtSql 是作為 Qt 的一個(gè)模塊提供的。為了使用有關(guān)數(shù)據(jù)庫的類,我們必須早 .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ù)庫連接。我們使用QSqlDatabase::addDatabase()靜態(tài)函數(shù)完成這一請(qǐng)求,也就是創(chuàng)建了一個(gè)QSqlDatabase實(shí)例。注意,數(shù)據(jù)庫連接使用自己的名字進(jìn)行區(qū)分,而不是數(shù)據(jù)庫的名字。例如,我們可以使用下面的語句:

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE", QString("con%1").arg(dbName));

1

此時(shí),我們是使用addDatabase()函數(shù)的第二個(gè)參數(shù)來給這個(gè)數(shù)據(jù)庫連接一個(gè)名字。在這個(gè)例子中,用于區(qū)分這個(gè)數(shù)據(jù)庫連接的名字是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ù)庫建立多個(gè)連接。

我們這里使用的是 sqlite 數(shù)據(jù)庫,只需要指定數(shù)據(jù)庫名字即可。如果是數(shù)據(jù)庫服務(wù)器,比如 MySQL,我們還需要指定主機(jī)名、端口號(hào)、用戶名和密碼,這些語句使用注釋進(jìn)行了簡(jiǎn)單的說明。

接下來我們調(diào)用了QSqlDatabase::open()函數(shù),打開這個(gè)數(shù)據(jù)庫連接。通過檢查open()函數(shù)的返回值,我們可以判斷數(shù)據(jù)庫是不是正確打開。

QtSql 模塊中的類大多具有l(wèi)astError()函數(shù),用于檢查最新出現(xiàn)的錯(cuò)誤。如果你發(fā)現(xiàn)數(shù)據(jù)庫操作有任何問題,應(yīng)該使用這個(gè)函數(shù)進(jìn)行錯(cuò)誤的檢查。這一點(diǎn)我們也在上面的代碼中進(jìn)行了體現(xiàn)。當(dāng)然,這只是最簡(jiǎn)單的實(shí)現(xiàn),一般來說,更好的設(shè)計(jì)是,不要在數(shù)據(jù)庫操作中混雜界面代碼(并且將這個(gè)connect()函數(shù)放在一個(gè)專門的數(shù)據(jù)庫操作類中)。

接下來我們可以在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ù)庫。如果打開成功,我們通過一個(gè)QSqlQuery實(shí)例執(zhí)行了 SQL 語句,就是query.exec();。同樣,我們使用其lastError()函數(shù)檢查了執(zhí)行結(jié)果是否正確。

注意這里的QSqlQuery實(shí)例的創(chuàng)建。我們并沒有指定是為哪一個(gè)數(shù)據(jù)庫連接創(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ù)庫系統(tǒng)不能成功完成connect()或者rollback()函數(shù)的調(diào)用。此時(shí),我們必須首先將活動(dòng)的 SELECT 語句設(shè)置成不活動(dòng)的。

創(chuàng)建過數(shù)據(jù)庫表 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ù)庫。我們需要插入多條數(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ù)庫提供的一種特性,它會(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ù)庫存儲(chǔ)的數(shù)據(jù)。

對(duì)于數(shù)據(jù)庫事務(wù)的操作,我們可以使用 QSqlDatabase::transaction() 開啟事務(wù),QSqlDatabase::commit() 或者QSqlDatabase::rollback() 結(jié)束事務(wù)。使用QSqlDatabase::database()函數(shù)則可以根據(jù)名字獲取所需要的數(shù)據(jù)庫連接。

文章題目:包含qt使用nosql的詞條
標(biāo)題鏈接:http://chinadenli.net/article0/dsgecoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管外貿(mào)網(wǎng)站建設(shè)建站公司GoogleApp開發(fā)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)