第一篇:Qt數(shù)據(jù)庫總結(jié)
Qt數(shù)據(jù)庫總結(jié)
#include
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);采用QSQLITE數(shù)據(jù)庫,QMYSQL數(shù)據(jù)庫有問題?
db.setHostName(“l(fā)ocalhost”);//設(shè)置數(shù)據(jù)庫主機(jī)名
db.setDatabaseName(“test”);//設(shè)置數(shù)據(jù)庫名
db.setUserName(“root”);//設(shè)置數(shù)據(jù)庫登入用戶名
db.setPassword(“123456”);//設(shè)計(jì)數(shù)據(jù)庫登入密碼
db.open()打開數(shù)據(jù)庫連接 db.close();//釋放數(shù)據(jù)庫
QStringList drivers = QSqlDatabase::drivers();//靜態(tài)成員函數(shù),是類的成員函數(shù),不是對(duì)象的.返回所有可用的數(shù)據(jù)庫驅(qū)動(dòng)程序的清單
drivers.removeAll(“QMYSQL3”);//刪除列表中的項(xiàng)
foreach(QString driver, drivers)//遍歷數(shù)據(jù)庫驅(qū)動(dòng),測試數(shù)據(jù)庫驅(qū)動(dòng)種類
qDebug()<< “t” << driver;建立數(shù)據(jù)庫文件
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會(huì)自動(dòng)增加,因?yàn)檫@里不能重復(fù),否則數(shù)據(jù)庫無法修改
“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類,查詢數(shù)據(jù)庫,插入值到數(shù)據(jù)庫等操作數(shù)據(jù)庫
QSqlQuery query;
query.prepare(“INSERT INTO T_USER(name, age)VALUES(:name, :age)”);//準(zhǔn)備執(zhí)行SQL查詢
query.bindValue(“:name”, “justin”);//在這定占位符上確定綁定的值 query.bindValue(“:age”, 33);query.exec();
QSqlQuery query;//以下執(zhí)行相關(guān)QSL語句
query.exec(“create table student(id int primary key,name varchar)”);
//新建student表,id設(shè)置為主鍵,還有一個(gè)name項(xiàng)
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”);
來查詢出表中所有的內(nèi)容。其中的SQL語句“select * from student”中“*”號(hào)表明查詢表中記錄的所有屬性。而當(dāng)query.exec(“select * from student”);這條語句執(zhí)行完后,我們便獲得了相應(yīng)的執(zhí)行結(jié)果,因?yàn)楂@得的結(jié)果可能不止一條記錄,所以我們稱之為結(jié)果集。
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指向結(jié)果集的第n條記錄。指定當(dāng)前的位置 first():query指向結(jié)果集的第一條記錄。last():query指向結(jié)果集的最后一條記錄。
next():query指向下一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。
previous():query指向上一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的上一條記錄。
record():獲得現(xiàn)在指向的記錄。
value(int n):獲得屬性的值。其中n表示你查詢的第n個(gè)屬性,比方上面我們使用“select * from student”就相當(dāng)于“select id, name from student”,那么value(0)返回id屬性的值,value(1)返回name屬性的值。該函數(shù)返回QVariant類型的數(shù)據(jù),關(guān)于該類型與其他類型的對(duì)應(yīng)關(guān)系,可以在幫助中查看QVariant。
at()//返回當(dāng)前查詢的位置
int fieldNo = query.record().indexOf(“name”);//返回“name”的列號(hào)
int rowNum = query.at();
//獲取query所指向的記錄在結(jié)果集中的編號(hào)
int columnNum = query.record().count();
//獲取每條記錄中屬性(即列)的個(gè)數(shù)
int fieldNo = query.record().indexOf(“name”);
//獲取”name”屬性所在列的編號(hào),列從左向右編號(hào),最左邊的編號(hào)為0
int id = query.value(0).toInt();
//獲取id屬性的值,并轉(zhuǎn)換為int型
QString name = query.value(fieldNo).toString();
//獲取name屬性的值
qDebug()<< “rowNum is : ” << rowNum //將結(jié)果輸出
<< ” id is : ” << id
<< ” name is : ” << name
<< ” columnNum is : ” << columnNum;
} if(query.seek(2))//seek指定當(dāng)前的位置
if(query.seek(ui->spinBox->value()))
{
qDebug()<< query.value(0).toInt()<< query.value(1).toString();
while(query.next())//每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。
{
qDebug()<< query.value(0).toInt()<< query.value(1).toString();//value(i)返回i字段的值,0表示id,1表示name
}
}
//批處理操作函數(shù)--批量插入到數(shù)據(jù)庫中
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);
//最后一個(gè)是空字符串,應(yīng)與前面的格式相同
q.addBindValue(names);
if(!q.execBatch())//進(jìn)行批處理,如果出錯(cuò)就輸出錯(cuò)誤
qDebug()<< q.lastError();
//事務(wù)操作--操作函數(shù)transaction(),commit()提交,rollback()回滾 事務(wù)是數(shù)據(jù)庫的一個(gè)重要功能,所謂事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫操作序列,這些操作要么全做要么全不做,是一個(gè)不可分割的工作單位。
在Qt中用transaction()開始一個(gè)事務(wù)操作,用commit()函數(shù)或rollback()函數(shù)進(jìn)行結(jié)束。commit()表示提交,即提交事務(wù)的所有操作。
具體地說就是將事務(wù)中所有對(duì)數(shù)據(jù)庫的更新寫回到數(shù)據(jù)庫,事務(wù)正常結(jié)束。rollback()表示回滾,即在事務(wù)運(yùn)行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進(jìn)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫的所有已完成的操作全部撤銷,回滾到事務(wù)開始時(shí)的狀態(tài)。
if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions))//先判斷該數(shù)據(jù)庫是否支持事務(wù)操作。hasFeature是QSQLDriver類函數(shù)
if(QSqlDatabase::database().transaction())//啟動(dòng)事務(wù)操作
QModelIndex類--用來定義數(shù)據(jù)模型中的數(shù)據(jù)
第三:QSqlQueryModel類
只讀數(shù)據(jù)模型為數(shù)據(jù)庫結(jié)果集
函數(shù):void QSqlQueryModel::setQuery(const QString & query, const QSqlDatabase & db = QSqlDatabase()//執(zhí)行訪問query從給定的數(shù)據(jù)庫db setHeaderData()
//設(shè)置水平頭標(biāo)題
columnCount();//獲得列數(shù)
columnCount();//獲得列數(shù)
QSqlRecord QSqlQueryModel::record(int row)const //返回row行包含的信息
QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex())//返回指定的行和列的確定的那個(gè)索引(index)index.data()//返回index索引的值 1.QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery(“select * from student”);//查詢整個(gè)student表的內(nèi)容,訪問給定的數(shù)據(jù)庫
model->setHeaderData(0, Qt::Horizontal, tr(“id”));
model->setHeaderData(1, Qt::Horizontal, tr(“name”));
QTableView *view = new QTableView;
view->setModel(model);//重新定義模型,model直接從database.db的數(shù)據(jù)庫中插入數(shù)據(jù)
view->show();2.int column = model->columnCount();//獲得列數(shù)
int row = model->rowCount();
// 獲得行數(shù)
QSqlRecord record = model->record(1);//獲得一條記錄
QModelIndex index = model->index(1,1);//獲得一條記錄的一個(gè)屬性的值
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相關(guān)的模型
query.exec(“insert into student values(10,'yafei10')”);//在模型中插入一條記錄
model->setQuery(“select * from student”);//再次查詢整張表
view->show();//再次進(jìn)行顯示,這句也可以不寫
4.使QSqlQueryModel類
創(chuàng)建的數(shù)據(jù)庫能讀寫
繼承QAbstractItemModel類
剛開始我們就講到,這個(gè)模型默認(rèn)是只讀的,所以我們在窗口上并不能對(duì)表格中的內(nèi)容進(jìn)行修改。但是我們可以創(chuàng)建自己的模型,然后按照我們自己的意愿來顯示數(shù)據(jù)和修改數(shù)據(jù)。
要想使其可讀寫,需要自己的類繼承自QSqlQueryModel,并且重寫setData()和 flags()兩個(gè)函數(shù)。如果我們要改變數(shù)據(jù)的顯示,就要重寫data()函數(shù)。bool QAbstractItemModel::setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)//設(shè)置根據(jù)index索引到的value值
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index)const //返回給定的index索引的標(biāo)志
QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole)const //返回index和role(顯示狀態(tài))確定的值 Qt::ItemFlags MySqlQueryModel::flags(const QModelIndex &index)const //返回表格是否可更改的標(biāo)志 {
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if(index.column()== 1)//第二個(gè)屬性可更改
flags |= Qt::ItemIsEditable;//flags能被編輯,所以第二列能被編輯
return flags;} QVariant MySqlQueryModel::data(const QModelIndex &index, int role)const
//更改數(shù)據(jù)顯示樣式 {
QVariant value = QSqlQueryModel::data(index, role);
if(role == Qt::TextColorRole && index.column()== 0)//Qt::TextColorRole是確定顏色等為9,所以與之后是第一列
return qVariantFromValue(QColor(Qt::red));//第一個(gè)屬性的字體顏色為紅色
return value;}
第四:QSqlTableModel 繼承QSqlQueryModel類--該類提供了一個(gè)可讀寫單張SQL表的可編輯數(shù)據(jù)模型,功能:修改,插入,刪除,查詢,和排序 QSqlTableModel *model = new QSqlTableModel;virtual bool removeColumns(int column, int count, const QModelIndex & parent = QModelIndex())//model->removeColumns(0)刪除第一列 bool QSqlTableModel::submitAll(),//提交所有被修改的數(shù)據(jù),然后修改的數(shù)據(jù)被保存在數(shù)據(jù)庫中 void QSqlTableModel::revertAll()//撤銷所有的修改,但是如果數(shù)據(jù)庫已經(jīng)被提交了修改,就不能通過撤銷修改改回來了
void QSqlTableModel::setFilter(const QString & filter)//篩選,按照字符串filter對(duì)數(shù)據(jù)庫進(jìn)行篩選
bool QSqlTableModel::select()//在篩選和排序的條件下,將數(shù)據(jù)庫中符合要求的在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);//設(shè)置保存策略為手動(dòng)提交,OnManualSubmit表明我們要提交修改才能使其生效。1.//在tableview表格中顯示數(shù)據(jù)庫數(shù)據(jù)
model = new QSqlTableModel(this);
model->setTable(“student”);//設(shè)置“student”的數(shù)據(jù)庫表格
model->setEditStrategy(QSqlTableModel::OnManualSubmit);//設(shè)置保存策略為手動(dòng)提交
model->select();//選取整個(gè)表的所有行
// model->removeColumn(1);//不顯示name屬性列,如果這時(shí)添加記錄,則該屬性的值添加不上。
ui->tableView->setModel(model);//重新定義模型,model直接從database.db的數(shù)據(jù)庫中插入數(shù)據(jù)
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//使其不可編輯
2.//當(dāng)tableview被修改后,要通過submitAll()函數(shù)進(jìn)行保存 bool QSqlTableModel::submitAll(),提交所有被修改的數(shù)據(jù),然后修改的數(shù)據(jù)被保存在數(shù)據(jù)庫中
model->database().transaction();//開始事務(wù)操作
if(model->submitAll()){ //提交所有被修改的數(shù)據(jù),然后修改的數(shù)據(jù)被保存在數(shù)據(jù)庫中
model->database().commit();//提交
} else {
model->database().rollback();//回滾
QMessageBox::warning(this, tr(“tableModel”),tr(“數(shù)據(jù)庫錯(cuò)誤: %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));//根據(jù)姓名進(jìn)行篩選
model->select();//顯示結(jié)果 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();//返回當(dāng)前的選擇模式
QModelIndexList selected = selections->selectedIndexes();//返回所有選定模型項(xiàng)目索引列表
foreach(QModelIndex index, selected)
{
int curRow=index.row();
model->removeRow(curRow);//刪除所有被選中的行
}
int ok = QMessageBox::warning(this,tr(“刪除當(dāng)前行!”),tr(“你確定”
“刪除當(dāng)前行嗎?”),QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();//如果不刪除,則撤銷
}
else model->submitAll();//否則提交,在數(shù)據(jù)庫中刪除該行 6.插入操作//插入行
int rowNum = model->rowCount();//獲得表的行數(shù)
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--該類為單張的數(shù)據(jù)庫表提供了一個(gè)可編輯的數(shù)據(jù)模型,它支持外鍵,除此之外和QSqlTableModel沒有什么不同
model->setRelation(2,QSqlRelation(“course”,”id”,”name”));//設(shè)置外鍵
//將student表的第三個(gè)屬性設(shè)為course表的id屬性的外鍵,并將其顯示為course表的name屬性的值(course表在id上顯示為name屬性值)如果用戶更改課程屬性,那么他只能在課程表中有的課程中進(jìn)行選擇,而不能隨意填寫課程。在Qt中的QSqlRelationalDelegate委托類就能實(shí)現(xiàn)這個(gè)功能 ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));QSqlRelationalDelegate類--提供委托delegate用來顯示編輯QSqlRelationalTableModel類 QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));
QDataWidgetMapper類可以將數(shù)據(jù)庫和控件(如QLineEdit)連接起來,使控件得到數(shù)據(jù)庫的值(例子:editEmployees)
第六:QTableView、QListView、QTreeView和QSqlite
第二篇:Qt期末知識(shí)點(diǎn)總結(jié)
題型:選擇、判斷、簡答、程序設(shè)計(jì)
一、基本知識(shí)點(diǎn) 1.簡單解釋Qt。
2.QtGUI應(yīng)用程序的main()程序結(jié)構(gòu)。
3.利用QtCreator創(chuàng)建窗口時(shí),系統(tǒng)提供的3個(gè)基類分別是什么?
4.信號(hào)與槽 機(jī)制作用,信號(hào)與插槽關(guān)聯(lián)函數(shù)connection()在那個(gè)類中定義,前4個(gè)參數(shù)的意義,兩種關(guān)聯(lián)(手動(dòng)、自動(dòng))的區(qū)別。
5.模態(tài)和非模態(tài)對(duì)話框(概念、創(chuàng)建、初始化、運(yùn)行、取結(jié)果)。6.標(biāo)準(zhǔn)對(duì)話框種類。
7.布局管理器的任務(wù),布局及相關(guān)的類(QHBoxLayout、QVBoxLayout、QGridLayout、QStackLayout)管理窗體上子窗口部件的布局方法,以及編程方法。
8.QmainWindow框架包含的組件(圖5-2)QmainWindow各部件使用的編程方法。9.Qt對(duì)C++的一些擴(kuò)展:Q_OBJECT、emit、moc、uic。
10.為應(yīng)用程序提供圖片的常用方法(資源機(jī)制),如何使用資源 動(dòng)作(action)。11.創(chuàng)建菜單和工具欄的步驟 中央窗口(中心部件)。12.事件概念,幾種常見的事件,Qt中定時(shí)的方法及編程。13.Qt中事件處理和事件過濾方法 事件傳遞順序。
14.順序容器(QVector(T)、QLinkedList(T)、QList(T)、QStack(T)、QQueue(T))關(guān)聯(lián)容器(QMap
16.QPainter的三個(gè)主要設(shè)置(畫筆、畫刷、字體)及相應(yīng)的類(QPen/QBrush/QFont)。17.Qt中輸入輸出方法及相關(guān)類 文本文件和二進(jìn)制文件讀寫操作。18.數(shù)據(jù)庫和網(wǎng)絡(luò)應(yīng)用程序中,在pro文件中分別要加入什么模塊。
19.利用SQL語句Qt數(shù)據(jù)庫應(yīng)用程序的基本操作步驟(連接、查詢、取結(jié)果),SQL模型類型。
20.Qt中與網(wǎng)絡(luò)相關(guān)的類(QNetworkAccessManager、QFtp、QHttp、QTcpSocket、QUdpSocket、QtcpServer),TCP客戶與服務(wù)器通信程序模型。21.線程概念及Qt相關(guān)類 線程的創(chuàng)建與啟動(dòng)
22.線程的同步與互斥,方法(Qmutex、QreadWriteLock、Qsemphore、QWaitCondition)
二、簡單程序設(shè)計(jì) 1.對(duì)話框應(yīng)用程序。
2.主窗口創(chuàng)建動(dòng)作、工具欄、菜單的程序代碼。3.幾種布局方法的關(guān)鍵代碼。4.文本文件和二進(jìn)制文件讀寫操作。
5.Qt數(shù)據(jù)庫基本應(yīng)用程序(利用SQL語句或SQL查詢模型)6.簡單的TCP客戶與服務(wù)器程序
第三篇:QT 學(xué)習(xí)心得
QT 學(xué)習(xí)心得體會(huì)
1:#include
2:fcntl.h文件控制,包含了open read write等等文件函數(shù),O_RDONLY只讀方式打開文件,O_WRONLY只寫方式打開文件,O_RDWR可讀寫方式打開文件,O_NOCTTY如果欲打開的文件為終端設(shè)備時(shí),則不會(huì)將終端機(jī)當(dāng)成進(jìn)程控制終端機(jī),O_NONBLOCK以不可阻擋方式打開文件,也就是無論有無數(shù)據(jù)讀取活等待,都會(huì)立即返回進(jìn)程之中。
3:unistd.h是POSIX標(biāo)準(zhǔn)定義的unix類符號(hào)常量的頭文件,包含了許多UNIX系統(tǒng)服務(wù)的函數(shù)原型,例如read函數(shù)、write函數(shù)和getpid函數(shù)
4:我們所用的版本是qtopia2.2 頭文件格式 #include
5:v4l2是內(nèi)核提供給應(yīng)用程序訪問音,視頻驅(qū)動(dòng)的統(tǒng)一接口
6:v4l2的工作流程
打開設(shè)備->檢查和設(shè)置設(shè)備屬性->設(shè)置抮格式->設(shè)置一種輸入輸出方法->循環(huán)獲取數(shù)據(jù)->關(guān)閉設(shè)備,在對(duì)底層設(shè)備如攝像頭或串口操作時(shí),需要調(diào)用fcntl.hunistd.h,int
fd=open(“/dev/video0”,O_RDWR),將終端設(shè)備打開,前面是設(shè)備名稱,后面為打開的方式,讀,寫,讀寫
7:ioctl是中對(duì)設(shè)備的進(jìn)行管理的函數(shù)。所謂對(duì)I/O通道進(jìn)行管理,就是對(duì)設(shè)備的一些特性進(jìn)行控制,例如串口的傳輸波特率、馬達(dá)的轉(zhuǎn)速等等。它的調(diào)用個(gè)數(shù)如下:
int ioctl(int fd, int cmd, …);
其中fd就是用戶程序打開設(shè)備時(shí)使用open函數(shù)返回的文件標(biāo)示符,cmd就是用戶程序?qū)υO(shè) 備的控制命令,至于后面的省略號(hào),那是一些補(bǔ)充參數(shù),一般最多一個(gè),有或沒有是和cmd的意義相關(guān)的。
8:memset將s所指向的某一塊內(nèi)存中的每個(gè)的內(nèi)容全部設(shè)置為ch指定的ASCII值, 塊的大小由第三個(gè)參數(shù)指定,這個(gè)函數(shù)通常為新申請(qǐng)的內(nèi)存做初始化工作, 其返回值為指向S的指void *memset(void *s, int ch, unsigned n);
9:由于qt designer不支持中文,所以需要編碼顯示中文,通常操作方法,添加頭文件#include
SnapButton->setText(BianMa->toUnicode(“執(zhí)行”));
10:在控制水平滑動(dòng)條(垂直滑動(dòng)條)移動(dòng)的時(shí)候,為減少畫面閃爍感,采用雙緩沖技術(shù)
11:
Qt是諾基亞開發(fā)的一個(gè)跨平臺(tái)的C++圖形用戶界面框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮?,很容易擴(kuò)展,并且允許真正地組件編程。自從 1996年早些時(shí)候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的 Linux桌面環(huán)境KDE 的基礎(chǔ)?;旧?,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界 面庫和 Windows平臺(tái)上的 MFC,OWL,VCL,ATL 是同類型的東西,但Qt具有優(yōu)良的跨平臺(tái)特性、面向?qū)ο蟆⒇S富的API、大量的開發(fā)文檔等優(yōu)點(diǎn)。
qt是跨平臺(tái)的程序設(shè)計(jì)框架,在不同平臺(tái)上版本不同。寫好的代碼需要在什么平臺(tái)上運(yùn)行,就采用那個(gè)平臺(tái)上的qt編譯器進(jìn)行編譯。
qt支持嵌入式開發(fā),qtopia是它的嵌入式版本。在主機(jī)上開發(fā)的程序,通過qtopia編譯之后,傳到嵌入式平臺(tái)上就可以運(yùn)行。前提是這個(gè)平臺(tái)上已經(jīng)安裝了qtopia程序的運(yùn)行環(huán)境。
12:V4L2(video 4 linux 2)
程序有發(fā)現(xiàn)設(shè)備的能力和操作設(shè)備.它主要是用過一系列的回調(diào)函數(shù)來實(shí)現(xiàn)這些功能.像設(shè)置高頻頭的頻率,幀頻,視頻壓縮格式和圖像像參數(shù)等等(在我寫的FM驅(qū)動(dòng)中就主要是設(shè)置頻率,設(shè)置音量等)
查詢設(shè)備屬性:VIDEOC_QUERYCAP
所以IOCTL主要用來控制I/O的屬性,可用來獲取設(shè)備信息,或用來顯示所有偵格式,獲取內(nèi)存等等IO操作
int ioctl(int fd,int request,struct v4l2_capability *argp);
顯示設(shè)備信息: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)[靜態(tài)]
把從sender對(duì)象發(fā)送的signal和receiver對(duì)象中的member連接起來,并且如果連接成功返回真,否則返回假,所以當(dāng)Sinal和SLOT信號(hào)都在同一個(gè)頁面文件時(shí)候,sender和receiver都是this
14: BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); 該函數(shù)對(duì)指定的源設(shè)備環(huán)境區(qū)域中的像素進(jìn)行位塊(bit_block)轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境??梢杂靡噪p緩沖技術(shù)
15:在調(diào)用libjpeg庫之前,首先要多l(xiāng)ibjpeg的源代碼進(jìn)行交叉編譯,再將庫中聲稱的部分文件拷到工作目錄下
第四篇:QT讀取注冊表總結(jié)
問題:使用QSettings時(shí),對(duì)于注冊表中類似于串口信息中的DeviceSerial0的這種key值,用value()函數(shù)無法讀到其value。
分析:QT在讀取注冊表時(shí),對(duì)于有路徑分隔符“”“/”的value都無法讀取,應(yīng)該屬于QT的一個(gè)小bug。解決方法:.h文件
#ifndef WIDGET_H #define WIDGET_H #include
#include
char keyvalue[256];//鍵值數(shù)組
DWORD keysize,type,valuesize;int indexnum;public: QString getcomm(int index,QString keyorvalue);//讀取鍵名 };#endif // WIDGET_H
.cpp 文件
#include “widget.h” #include “ui_widget.h”
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this);QString path = “HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM”;QSettings *settings = new QSettings(path, QSettings::NativeFormat);QStringList key = settings->allKeys();int num =(int)key.size();QString value;for(int i=0;i } Widget::~Widget(){ delete ui;} QString Widget::getcomm(int index,QString keyorvalue)//index為索引號(hào),keyorvalue為選擇返回值應(yīng)該為key還是value { QString commresult; if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT(“HARDWAREDEVICEMAPSERIALCOMM”),0,KEY_READ,&hKey)!=0){ QString error=“Cannot open regedit!”;//無法打開注冊表時(shí)返回error return error;}//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0) QString keymessage;//鍵名 QString message;QString valuemessage;//鍵值 indexnum = index;//要讀取鍵值的索引號(hào) keysize=sizeof(keyname);valuesize=sizeof(keyvalue); if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)//列舉鍵名和值 { for(int i=0;i for(int j=0;j if(keyorvalue==“key”){ commresult=keymessage;} if(keyorvalue==“value”){ commresult=valuemessage;} } else { commresult=“nokey”;} //if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)列舉鍵名和值 return commresult;::RegCloseKey(hKey);//關(guān)閉注冊表 } 數(shù)據(jù)庫老師畫的重點(diǎn) 數(shù)據(jù)庫:數(shù)據(jù)庫是長期存儲(chǔ)在計(jì)算機(jī)內(nèi)、有組織、可共享的大數(shù)據(jù)集合。數(shù)據(jù)庫操縱功能:查詢select、插入insert、刪除delete、修改update 數(shù)據(jù)庫系統(tǒng)的特點(diǎn):1數(shù)據(jù)結(jié)構(gòu)化2數(shù)據(jù)的共享高,冗余度低,易擴(kuò)充3數(shù)據(jù)獨(dú) 立性高4數(shù)據(jù)由DBMS統(tǒng)一管理和控制 數(shù)據(jù)模型的組成要素:數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作、完整性約束 概念模型:要出大體,畫圖 信息世界中的基本概念———— 1、實(shí)體:客觀存在并可以相互區(qū)別的事物稱為實(shí)體 2、屬性:實(shí)體所具有的某一特性 3、碼(key):唯一標(biāo)識(shí)實(shí)體的屬性集稱為碼 4、域(domain):域是一組具有相同數(shù)據(jù)類型的集合 5、實(shí)體型(entity type):具有相同屬性的實(shí)體必然具有共同的特征和性質(zhì)。用實(shí)體名 及屬性名集合來抽象和刻畫同類實(shí)體,稱為實(shí)體型。 6、實(shí)體集(entity set):同一類型的實(shí)體的集合 7、聯(lián)系:在現(xiàn)實(shí)世界中,事物內(nèi)部以及事物之間是有聯(lián)系的,這些聯(lián)系在信息世界中 反應(yīng)為實(shí)體(型)內(nèi)部的聯(lián)系和實(shí)體(型)之間的聯(lián)系。實(shí)體內(nèi)部的聯(lián)系通常是指 組成實(shí)體的各屬性之間的聯(lián)系;實(shí)體之間的聯(lián)系通常是指不同實(shí)體集之間的聯(lián)系 最常用的數(shù)據(jù)模型: 1、層次模型(Hierarchical Model) 2、網(wǎng)狀模型(Network Model) 3、關(guān)系模型(Relational Model) 4、面向?qū)ο竽P停∣bject Oriented Model) 5、對(duì)象關(guān)系模型(Object Relational Model)其中層次模型和網(wǎng)狀模型統(tǒng)稱為格式化模型 數(shù)據(jù)庫系統(tǒng)的三級(jí)模式結(jié)構(gòu): 1、模式(scheme):模式也稱邏輯模式,是數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是所有用戶的公共數(shù)據(jù)視圖。他是數(shù)據(jù)庫系統(tǒng)模式結(jié)構(gòu)的中間層,既不設(shè)計(jì)涉及數(shù)據(jù)的物理存儲(chǔ)細(xì)節(jié)和硬件環(huán)境,也與具體的應(yīng)用程 序、所使用的應(yīng)用開發(fā)工具及高級(jí)程序設(shè)計(jì)語言無關(guān)。 2、外模式(external schema):外模式也稱為子模式(subschema)或用戶模式,他是數(shù) 據(jù)庫用戶(包括應(yīng)用程序員和最終用戶)能看見和使用 的局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是數(shù)據(jù)庫用戶的數(shù)據(jù)視圖,是與某一應(yīng)用有關(guān)的數(shù)據(jù)的邏輯表示。 3、內(nèi)模式(internal scheme):內(nèi)模式也稱存儲(chǔ)模式(storage schema),一個(gè)數(shù)據(jù)庫只有 一個(gè)內(nèi)模式。他是數(shù)據(jù)庫物理結(jié)構(gòu)和存儲(chǔ)方式的描述,是 數(shù)據(jù)在數(shù)據(jù)庫內(nèi)部的表達(dá)方式。數(shù)據(jù)庫的二級(jí)映像功能與數(shù)據(jù)庫獨(dú)立性———— 為了能夠在系統(tǒng)內(nèi)部實(shí)現(xiàn)這3個(gè)抽象層次的聯(lián)系和轉(zhuǎn)換,數(shù)據(jù)庫管理系統(tǒng)在這三個(gè)模式之間提供了兩層映像: ·外模式/模式 映像 ·模式/內(nèi)模式 映像 正是這兩層映像保證了數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)能夠具有較高的邏輯獨(dú)立性和物理獨(dú)立性 關(guān)系(relation):D1*D2*D3··*Dn的子集叫做在域D1、D2、D3···Dn上的關(guān)系,表示 為R(D1、D2、D3···Dn) 這里的的R表示關(guān)系的名字,n是關(guān)系的目或度(degree)關(guān)系中每個(gè)元素是關(guān)系中的元組,通常用t表示 當(dāng)n=1時(shí),稱關(guān)系為單元關(guān)系(unary relation),或一元關(guān)系 當(dāng)n=2時(shí),稱該關(guān)系為二元關(guān)系(binary relation) 關(guān)系是笛卡爾積的有限子集,所以關(guān)系也是一個(gè)二維表,表的每行對(duì)應(yīng)一個(gè)元組,表的每列對(duì)應(yīng)一個(gè)域。由于域可以相同,為了加以區(qū)分,必須對(duì)每列起一個(gè)名字,稱為屬性(attribute)。n目關(guān)系必有n個(gè)屬性。 若關(guān)系中的某一屬性組的值能夠唯一的標(biāo)識(shí)一個(gè)元組,則稱該屬性組為候選碼(candidate key) 若一個(gè)關(guān)系有多個(gè)候選碼,則選定其中一個(gè)為主碼(primary key)候選碼的諸屬性稱為主屬性(prime attribute)。不包含在任何候選碼中的屬性稱為非主屬性(non-prime attribute)或非碼屬性(non-key attribute)P46 沒有搞明白干嘛使得?。。。。。。。。。?! 關(guān)系的三類完整性約束:實(shí)體完整性、參照完整性、用戶定義的完整性 實(shí)體完整性和參照完整性被稱作關(guān)系的兩個(gè)不變性 1、實(shí)體完整性(entity integrity):主碼中的屬性即主屬性不能取空值 2、參照完整性(referential integrity): 若屬性(或?qū)傩越M)F是基本關(guān)系R的外碼,它與基本關(guān)系S的的主碼K相對(duì)應(yīng)(基 本關(guān)系R和S不一定是不同的關(guān)系),則對(duì)于R中每個(gè)元組在F上的值必須為: ·或者取空值(F的每個(gè)屬性值均為空值)·或者等于S中某個(gè)元組的主碼值 SQL(Structured Query Language),即結(jié)構(gòu)化查詢語言,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL 的特點(diǎn): 1、綜合統(tǒng)一 2、高度非過程化 3、面向集合的操作方式 4、以同一種語法結(jié)構(gòu)提供多種使用方式 5、語言簡潔、易學(xué)易用 SQL的動(dòng)詞: 數(shù)據(jù)查詢:select 數(shù)據(jù)定義:create、drop、alter(房間)修改表 數(shù)據(jù)操縱:insert、update(家具)修改數(shù)據(jù)、delete 數(shù)據(jù)控制:grant、revoke 繪制ER圖———— 在ER圖中有如下四個(gè)成分: 矩形框:表示實(shí)體,在框中記入實(shí)體名。菱形框:表示聯(lián)系,在框中記入聯(lián)系名。 橢圓形框:表示實(shí)體或聯(lián)系的屬性,將屬性名記入框中。對(duì)于主屬性名,則在其名稱下 劃一下劃線。 連線:實(shí)體與屬性之間;實(shí)體與聯(lián)系之間;聯(lián)系與屬性之間用直線相連,并在直線上 標(biāo)注聯(lián)系的類型。(對(duì)于一對(duì)一聯(lián)系,要在兩個(gè)實(shí)體連線方向各寫1; 對(duì)于一對(duì) 多聯(lián)系,要在一的一方寫1,多的一方寫N;對(duì)于多對(duì)多關(guān)系,則要在兩個(gè)實(shí)體 連線方向各寫N,M。 基本表是本身獨(dú)立存在的表,在SQL中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)基本表。一個(gè)(或多個(gè))基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件,一個(gè)表可以帶若干索引,索引也可以放在存儲(chǔ)文件中。存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫的內(nèi)模式。存儲(chǔ)文件的物理結(jié)構(gòu)是任意的,對(duì)用戶是透明的。 視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。它本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫中,即數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對(duì)應(yīng)的數(shù)據(jù)。這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中,因此視圖是一個(gè)虛表。視圖在概念上與基本表等同,用戶可以在視圖上再定義視圖。 基本表的定義、刪除與修改: 1、定義基本表:create table ***() 2、定義主鍵:Primary key == not null(中間不用連接符號(hào))unique 3、定義外碼的語句:foreign key(某個(gè)字段)references 某表(某字段) 4、定義主碼語句:primary key(***,***) 5、修改基本表:alter table 某表名 add 列名<數(shù)據(jù)類型>[完整性約束] drop <完整性約束名>(字段名) alter column<列名><數(shù)據(jù)類型> 6、刪除表:drop table 表名[restrict | cascade級(jí)聯(lián)刪除] 7、建立索引:create [unique] [clustered] index 索引名 on 表名(列名[asc | desc],······)·clustered 表示是聚簇索引 ·unique表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄 ·用戶可以在最經(jīng)常查詢的列上建立聚簇索引以提高查詢效率 ·在一個(gè)基本表上只能建立一個(gè)聚簇索引 ·建立局促索引后,更新該索引列上的數(shù)據(jù)時(shí),往往導(dǎo)致表中記 錄的物理順序的額變更,代價(jià)較大,因此對(duì)于經(jīng)常更新的列不 宜建立聚簇索引 8、刪除索引:drop index <索引名> 上機(jī)的時(shí)候不太一樣:drop index 表名。索引名字 9、數(shù)據(jù)的查詢: select [all | distinct] <目標(biāo)列表達(dá)式>,······ from 表名或者視圖名,··· where 條件表達(dá)式 group by 列名1 [having 條件表達(dá)式] order by 列名2 [asc | desc] ·如果有g(shù)roup by 子句,則結(jié)果按“列名1”的值進(jìn)行分組,該屬性列值相 等的元組為一個(gè)組。通常會(huì)在每組中作用聚集函數(shù)。如果group by 子句帶 having短語,則只有滿足指定條件的組才予以輸出。 ·如果有order by 子句,則結(jié)果表按“列名2”的值的升序或降序排序 ·select Sname Name,‘Year of Birth:’Birth,2013-Sage Birthday,lower (Sdept)Department from Student lower表示小寫 常用的查詢條件———— 比 較:大于、等于、小于、不等于(< >/!=)、大于/小于等于、不小于、不大于、not+上述比較運(yùn)算符 確定范圍:between and,not between and 確定集合:in,not in 字符匹配:like,not like 空 值:is null,is not null 多重條件(邏輯運(yùn)算):and,or,not 例子———— ·select Sname,Sage from Student where Sdept(not)in(‘cs’,‘ma’,‘is’) 字符匹配:[not] like ‘字符串’[escape‘換嗎字符’] 百分號(hào)表示任意長度、下劃線表 示任意單個(gè)字符 聚集函數(shù)———— count([distinct | all] *) 統(tǒng)計(jì)元組個(gè)數(shù) count([distinct| all] 列名) 統(tǒng)計(jì)一列中值的個(gè)數(shù) sum([distinct| all] 列名) 計(jì)算一列值的總和(此列必須是數(shù)值型)avg([distinct| all] 列名) 計(jì)算一列的平局值(此列必須是數(shù)值型)max([distinct| all] 列名) 求一列中的最大值 min ·如果指定distinct短語,則表示在計(jì)算時(shí)要取消指定列中的重復(fù)值。如果不指定distinct 短語或者指定all短語(all為缺省值),則表示不取消重復(fù)。 ·注意在聚集函數(shù)遇到空值時(shí),除count(*)外,都跳過空值而只處理非空值?!ぷ⒁鈝here子句中不能用聚集函數(shù)作為條件表達(dá)式 group by子句———— where 子句與having 短語的區(qū)別在于作用對(duì)象不同。Where 子句作用對(duì)象作用于基本表或試圖,從中選擇條件的元組。Having短語作用于組,從中選擇滿足條件的組。 例子:select Sno from SC group by Sno having count(*)>3 查詢了選修3門以上課程的學(xué)生學(xué)號(hào) 鏈接查詢—————— 例子: 非自然鏈接 ·select Student.*,SC.* from Student,SC Where Student.Sno=SC.Sno 自然鏈接 ·select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade from Student,SC where Student.Sno=SC.Sno 自身鏈接 ·select FIRST.Cno,SECOND.Cpno from Course FIRST,Course SECOND where FIRST.Cpno=SECOND.Cpno 外連接 ·select Student.Sno,Sname,Sage,Sdept,Cno,Grade from Student left outer join SC on Student.Sno=SC.Sno ·左外鏈接列出左邊關(guān)系中所有的元組,右外連接列出右邊關(guān)系中的所有元組 嵌套查詢 ·select Sname from Student where Sno in(select Sno from SC where Cno=‘2’) ·找出每個(gè)學(xué)生超過他選修課程平均成績的課程號(hào) Select Sno,Cno From SC x Where Grade >=(select avg(Grade) From SC y Where y.Sno=x.Sno) 授權(quán)———— Grant 權(quán)限,····· On 對(duì)象類型 對(duì)象名,····· To 用戶,····· [with grant option]只一句表示權(quán)限的傳遞 例子: ·Grant all privileges On Student,Course To U1,U2 ·grant update(Sno),select on Student to u4 ·revoke update(Sno) on table Student from u4 一個(gè)滿足BCNF的關(guān)系模式有: ·所有非主屬性對(duì)每一個(gè)碼都是完全函數(shù)依賴 3NF 編輯 3NF,即第三范式是要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表,其中每個(gè)部門有部門編號(hào)(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號(hào)后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。滿足第三范式(3NF)必須先滿足第二范式(2NF) 2NF(第二范式) 第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。如圖3-2 員工信息表中加上了員工編號(hào)(emp_id)列,因?yàn)槊總€(gè)員工的員工編號(hào)是唯一的,因此每個(gè)員工可以被唯一區(qū)分。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。第五篇:數(shù)據(jù)庫總結(jié)