Qt中使用SQLite數據庫

前言

SQLite(sql)是一款開源輕量級的數據庫軟件,不須要server,能夠集成在其餘軟件中,很是適合嵌入式系統。
Qt5以上版本能夠直接使用SQLite(Qt自帶驅動)。
sql

用法

1 準備

  1. 引入SQL模塊
    在Qt項目文件(.pro文件)中,加入SQL模塊:
QT += sql
  1. 引用頭文件
    在須要使用SQL的類定義中,引用相關頭文件。例如:
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

2 使用

1. 創建數據庫

檢查鏈接、添加數據庫驅動、設置數據庫名稱、數據庫登陸用戶名、密碼。數據庫

QSqlDatabase database;
if (QSqlDatabase::contains("qt_sql_default_connection"))
{
    database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("MyDataBase.db");
    database.setUserName("XingYeZhiXia");
    database.setPassword("123456");
}

上述代碼解釋:
(1)第一行中,創建了一個QSqlDatabase對象,後續的操做要使用這個對象。
(2)if語句用來檢查指定的鏈接(connection)是否存在。這裏指定的鏈接名稱(connection name)是qt_sql_default_connection,這是Qt默認鏈接名稱。實際使用時,這個名稱能夠任意取。若是判斷此鏈接已經存在,那麼QSqlDatabase::contains()函數返回true。此時,進入第一個分支,QSqlDatabase::database()返回這個鏈接。
(3)若是這個鏈接不存在,則進入else分支,須要建立鏈接,並添加數據庫。在else分支第一行,addDatabase()的參數QSQLITE是SQLite對應的驅動名,不能改。並且須要注意的是,addDatabase()的第二個參數被省略了,第二個參數的默認參數就是上面提到的Qt默認鏈接名稱qt_sql_default_connection。若是須要使用自定義的鏈接名稱(若是程序須要處理多個數據庫文件的話就會這樣),則應該加入第二個參數,例如


express

database = QSqlDatabase::addDatabase("QSQLITE", "my_sql_connection);

這個時候,若是在另外一個地方須要判斷my_sql_connection鏈接是否存在,就應該使用if (QSqlDatabase::contains("my_sql_connection"))
(4)else分支第二行中,setDatabaseName()的參數是數據庫文件名。若是這個數據庫不存在,則會在後續操做時自動建立;若是已經存在,則後續的操做會在已有的數據庫上進行。
(5)else分支後面兩行,設置用戶名和密碼。用戶名,密碼均可以隨便取,也能夠省略。

數組

2. 打開數據庫

使用open()打開數據庫,並判斷是否成功。注意,在第一步檢查鏈接是否存在時,若是鏈接存在,則在返回這個鏈接的時候,會默認將數據庫打開。app

if (!database.open())
{
    qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
    // do something
}

若是打開成功,則進入else分支。對數據庫的操做都須要在else分支中進行。函數

3. 關閉數據庫

數據庫操做完成後,最好關閉。佈局

database.close();

4. 操做數據庫

對數據庫進行操做須要用到QSqlQuery類,操做前必須定義一個對象。下面舉例說明操做方法。操做須要使用SQLite語句,本文中的幾個例子會使用幾個經常使用的語句,關於SQLite語句的具體信息請參考SQLite相關資料。
例1:建立表格
建立一個名爲student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年齡。

this

QSqlQuery sql_query;
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{
    qDebug() << "Error: Fail to create table." << sql_query.lastError();
}
else
{
    qDebug() << "Table created!";
}

代碼解釋:
(1)第一行定義一個QSqlQuery對象。
(2)第二行是一個QString,其中的內容是SQLite語句。對數據庫的操做,都是用SQLite的語句完成的,把這些指令以QString類型,經過prepare函數,保存在QSqlQuery對象中。也可將指令,以QString形式直接寫在exec()函數的參數中,例如:

spa

sql_query.exec("create table student (id int primary key, name varchar(30), age int)");

建立表格語句:create table <table_name> (f1 type1, f2 type2,…);
create table是建立表格的語句,也可用大寫CREATE TABLE;student是表格的名稱,能夠任意取;括號中是表格的格式,上述指令代表,表格中有三列,第一列的名稱(表頭)是id,這一列儲存的數據類型是int,第二列名稱是name,數據類型是字符數組,最多有30個字符(和char(30)的區別在於,varchar的實際長度是變化的,而char的長度始終是給定的值),第三列的名稱是age,數據類型是int。
若是sql_query.exec()執行成功,則建立表格成功。

3d

例2:插入數據
在剛纔建立的表格中,插入一行數據。

QString insert_sql = "insert into student values (?, ?, ?)";
sql_query.prepare(insert_sql);
sql_query.addBindValue(max_id+1);
sql_query.addBindValue("Wang");
sql_query.addBindValue(25);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "inserted Wang!";
}
if(!sql_query.exec("INSERT INTO student VALUES(3, \"Li\", 23)"))
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "inserted Li!";
}

插入語句:insert into <table_name> values (value1, value2,…);
insert into是插入語句,student是表格名稱,values()是要插入的數據。這裏,咱們插入了2組數據。插入第一組數據的時候,用addBindValue來替代語句中的?,替代的順序與addBindValue調用的順序相同。插入第二組數據的時候,則是直接寫出完整語句。

例3:更新數據(修改數據)

QString update_sql = "update student set name = :name where id = :id";
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", 1);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "updated!";
}

語句:update <table_name> set <f1=value1>, <f2=value2>… where <expression>;
更新(修改)的語句是update...set...,其中student是表格名稱,name是表頭名稱(即第二列),:name是待定的變量,where用於肯定是哪一組數據,:id也是待定變量。
bindValue(" ", " ")函數用來把語句中的待定變量換成肯定值。

例4:查詢數據
(1)查詢部分數據

QString select_sql = "select id, name from student";
if(!sql_query.exec(select_sql))
{
    qDebug()<<sql_query.lastError();
}
else
{
    while(sql_query.next())
    {
        int id = sql_query.value(0).toInt();
        QString name = sql_query.value(1).toString();
        qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);
    }
}

語句select <f1>, <f2>, ... from <table_name>;
select是查詢指令;<f1> 等等是要查詢的變量(即表頭),中間用逗號隔開;from ...指定表格。
上述語句是說查詢student表中的 id 和 name 。執行查詢以後,用sql_query.value(int)來得到數據。一樣地,value(0)表示第一個數據,即 id,value(1)表示name。注意value()函數的返回值類型是QVariant,所以要用toInt()等函數轉換成特定的類型。
(2)查詢所有數據


QString select_all_sql = "select * from student";
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{
    qDebug()<<sql_query.lastError();
}
else
{
    while(sql_query.next())
    {
        int id = sql_query.value(0).toInt();
        QString name = sql_query.value(1).toString();
        int age = sql_query.value(2).toInt();
        qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
    }
}

語句select * from <table_name>;
查詢全部數據用 * 表示。用while(sql_query.next())用來遍歷全部行。一樣用value()得到數據。
(3)查詢最大id

QString select_max_sql = "select max(id) from student";
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    while(sql_query.next())
    {
        max_id = sql_query.value(0).toInt();
        qDebug() << QString("max id:%1").arg(max_id);
    }
}

這個就是在語句中用max來獲取最大值。

例5:刪除與清空
(1)刪除一條數據

QString delete_sql = "delete from student where id = ?";
sql_query.prepare(delete_sql);
sql_query.addBindValue(0);
if(!sql_query.exec())
{
    qDebug()<<sql_query.lastError();
}
else
{
    qDebug()<<"deleted!";
}

語句delete from <table_name> where <f1> = <value>
delete用於刪除條目,用where給出限定條件。例如此處是刪除 id = 0的條目。
(2)清空表格(刪除全部)

QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "table cleared";
}

這裏沒有用where給出限制,就會刪除全部內容。

 

QT讀寫Sqlite數據庫的三種方式

 QT對一些基本的數據庫的訪問封裝,可謂是極大的方便的咱們開發人員,如今咱們就來講下QT對Sqlite這個數據庫的讀寫,Sqlite是一個比較小型的本地數據庫,對於保存一些軟件配置參數或量不是很大的數據是至關的方便,Qt自己已經自帶了Sqlite的驅動,直接使用相關的類庫便可,這篇咱們主要來講明QT訪問Sqlite數據庫的三種方式(即便用三種類庫去訪問),分別爲QSqlQuery、QSqlQueryModel、QSqlTableModel,對於這三種類庫,可看爲一個比一個上層,也就是封裝的更厲害,甚至第三種QSqlTableModel,根本就不須要開發者懂SQL語言,也能操做Sqlite數據庫。

一、首先使用QSqlQuery來訪問
      咱們先要在工程中包含與數據庫相關的幾個頭文件#include <QtSql/QSqlDatabase> 、#include <QtSql/QSqlRecord>、#include <QtSql/QSqlQuery>
訪問的數據庫內容結構爲:



 
  1. #include <QtWidgets/QApplication>

  2. #include <QCoreApplication>

  3. #include <QDebug>

  4.  
  5. #include <QtSql/QSqlDatabase>

  6. #include <QtSql/QSqlQuery>

  7. #include <QtSql/QSqlRecord>

  8.  
  9. typedef struct _testInfo //假定數據庫存儲內容

  10. {

  11. QString UsreName;

  12. QString IP;

  13. QString Port;

  14. QString PassWord;

  15. QString Type;

  16.  
  17. }testInfo;

  18.  
  19. int main(int argc, char *argv[])

  20. {

  21. QApplication a(argc, argv);

  22.  
  23. QVector<testInfo> infoVect; //testInfo向量,用於存儲數據庫查詢到的數據

  24.  
  25. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

  26.  
  27. db.setDatabaseName(QApplication::applicationDirPath() + "/CONFIG/" + "CONFIG.db");

  28. if (!db.open())

  29. {

  30. return 0;

  31. }

  32.  
  33. /**************************使用QSqlQuery操做數據庫**************************/

  34. QSqlQuery query; //執行操做類對象

  35.  
  36. //查詢數據

  37. query.prepare("SELECT * FROM T_USER_MANAGE");

  38. query.exec(); //執行

  39.  
  40. QSqlRecord recode = query.record(); //recode保存查詢到一些內容信息,如表頭、列數等等

  41. int column = recode.count(); //獲取讀取結果的列數

  42. QString s1 = recode.fieldName(0); //獲取第0列的列名

  43.  
  44. while (query.next())

  45. {

  46. testInfo tmp;

  47. tmp.UsreName = query.value("UsreName").toString();

  48. tmp.IP = query.value("IP").toString();

  49. tmp.Port = query.value("Port").toString();

  50. tmp.PassWord = query.value("PassWord").toString();

  51. tmp.Type = query.value("Type").toString();

  52.  
  53. infoVect.push_back(tmp); //將查詢到的內容存到testInfo向量中

  54. }

  55.  
  56. for (int i=0; i<infoVect.size(); i++) //打印輸出

  57. {

  58. qDebug() << infoVect[i].UsreName << ":" \

  59. << infoVect[i].IP << ":" \

  60. << infoVect[i].Port << ":" \

  61. << infoVect[i].PassWord << ":" \

  62. << infoVect[i].Type;

  63. }

  64.  
  65. //插入數據

  66. query.prepare("INSERT INTO T_USER_MANAGE (UsreName, IP, Port, PassWord, Type) VALUES (:UsreName, :IP, :Port, :PassWord, :Type)");

  67. query.bindValue(":UserName", "user4"); //給每一個插入值標識符設定具體值

  68. query.bindValue(":IP", "192.168.1.5");

  69. query.bindValue(":Port", "5004");

  70. query.bindValue(":PassWord", "55555");

  71. query.bindValue(":Type", "operator");

  72. query.exec();

  73.  
  74.  
  75. //更改表中 UserName=user4 的Type屬性爲admin

  76. query.prepare("UPDATE T_USER_MANAGE SET Type='admin' WHERE UserName='user4'");

  77. query.exec();

  78.  
  79. //刪除表中 UserName=user4的用戶信息

  80. query.prepare("DELETE FROM T_USER_MANAGE WHERE UserName='user4'");

  81. query.exec();

  82.  
  83. #endif

  84. /**************************使用QSqlQuery操做數據庫END***********************/

編譯輸出:

二、使用QSqlQueryModel來訪問

    QSqlQueryModel類帶有Model字樣,相信你已經猜到咱們能夠用他來關聯試圖,就能把數據庫的內容顯示到視圖上,固然,常規的操做也是能夠的,可是咱們只說說怎麼用這個類來把數據庫中的內容顯示到是視圖中,這裏咱們選擇的視圖類爲QTableView,直接上代碼吧
 

 
  1. #include <QtWidgets/QApplication>

  2. #include <QCoreApplication>

  3. #include <QDebug>

  4. #include <QString>

  5. #include <QTableView>

  6.  
  7. #include <QtSql/QSqlDatabase>

  8. #include <QtSql/QSqlQueryModel>

  9.  
  10. int main(int argc, char *argv[])

  11. {

  12. QApplication a(argc, argv);

  13.  
  14. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

  15.  
  16. db.setDatabaseName(QApplication::applicationDirPath() + "/CONFIG/" + "CONFIG.db");

  17. if (!db.open())

  18. {

  19. return 0;

  20. }

  21.  
  22. QSqlQueryModel *model = new QSqlQueryModel;

  23. model->setQuery("SELECT * FROM T_USER_MANAGE", db); //從給定的數據庫db執行sql操做, db需預先制定並打開

  24.  
  25. int column = model->columnCount(); //獲取列數

  26. int row = model->rowCount(); //獲取行數

  27.  
  28. model->setHeaderData(0, Qt::Horizontal, QStringLiteral("用戶名")); //設置表頭,如不設置則使用數據庫中的默認表頭

  29. model->setHeaderData(1, Qt::Horizontal, QStringLiteral("IP地址"));

  30. model->setHeaderData(2, Qt::Horizontal, QStringLiteral("端口"));

  31. model->setHeaderData(3, Qt::Horizontal, QStringLiteral("密碼"));

  32. model->setHeaderData(4, Qt::Horizontal, QStringLiteral("用戶類型"));

  33.  
  34. QTableView *view = new QTableView; //定義視圖,只能用於顯示,不能修改數據庫

  35. view->setFixedSize(500, 200);

  36. view->setModel(model);

  37.  
  38. view->show();

  39.  
  40. return a.exec();

  41. }

編譯運行一下:

三、最後使用QSqlTableModel來訪問
      最後咱們來講說使用QSqlTableModel這個類去操做Sqlite數據庫,這個類比上兩個封裝的更完全,即便咱們不懂SQL語言,也能實現對Sqlite數據庫的操做,而且這個類也能夠經過視圖來顯示修改數據庫內容,這裏我就拿這個類作了個用戶管理模塊,其實也能夠通用與其餘任何一個模塊,只要在生成對象時傳入sqlite的數據庫名及要操做的表名便可。

    在這個例子中,我實現了一個KSDemoDlg類,實際上是一個對話框類,裏邊包含了sqlite數據庫的顯示、修改等等功能,首先來看下效果(常規的增刪改查功能都有):

當咱們點擊增長、修改時,右邊的編輯框便爲可編輯狀態(說明下,右邊的編輯框是隨着加載的數據庫表變化而變化的,簡而言之就是能夠不作修改就能操做別的Sqlite數據庫),完畢肯定後便寫進數據庫,同時也在左邊的表格中顯示

頭文件:

 
  1. #ifndef __KSDEMODLG_H__

  2. #define __KSDEMODLG_H__

  3.  
  4. #include <QDialog>

  5. #include <QPushButton>

  6. #include <QLineEdit>

  7. #include <QLabel>

  8. #include <QComboBox>

  9. #include <QGroupBox>

  10. #include <QTableView>

  11. #include <QtSql/QSqlTableModel>

  12. #include <QtSql/QSqlDatabase>

  13.  
  14.  
  15. class KSDemoDlg : public QDialog

  16. {

  17. Q_OBJECT

  18.  
  19. enum {UPDATE, INSERT};

  20. int m_operator;

  21.  
  22. public:

  23. explicit KSDemoDlg(QString databaseName, QString dataTableName, QWidget *parent = 0 );

  24. ~KSDemoDlg();

  25.  
  26. private:

  27.  
  28. void UiInit();

  29.  
  30. protected slots:

  31. void onNewButtonClicked();

  32. void onQueryButtonClicked();

  33. void onUpdateButtonClicked();

  34. void onDeleteButtonClicked();

  35. void onPrimaryKeyLineEditEmpty(const QString & text);

  36. void onCurrentTableViewClicked(const QModelIndex & index);

  37. void onOKButtonClicked();

  38. void onCancelButtonClicked();

  39.  
  40. private:

  41. QSqlDatabase m_db;

  42. QString m_DBName;

  43. QString m_DBTableName;

  44.  
  45. private:

  46. QTableView* m_TabView;

  47. QSqlTableModel* m_model;

  48.  
  49. private:

  50. QList<QLineEdit*> m_infoEditList;

  51. QList<QLabel*> m_infoLabelList;

  52. QPushButton m_OKButton;

  53. QPushButton m_CancelButton;

  54.  
  55. private:

  56.  
  57. /*全部用戶信息容器組*/

  58. QGroupBox m_Group;

  59.  
  60. QLabel m_PrimaryKeyLabel;

  61. QLineEdit m_PrimaryKeyLineEdit;

  62. QPushButton m_QueryButton;

  63.  
  64. QPushButton m_NewButton;

  65. QPushButton m_UpdateButton;

  66. QPushButton m_DeleteButton;

  67.  
  68. /*所選擇用戶信息容器組*/

  69. QGroupBox m_SelectGroup;

  70.  
  71. };

  72.  
  73. #endif // __KSDEMODLG_H__

.cpp文件
 

 
  1. #include <QtWidgets/QApplication>

  2. #include <QCoreApplication>

  3. #include <QString>

  4. #include <QFormLayout>

  5. #include <QVBoxLayout>

  6. #include <QHBoxLayout>

  7. #include <QMessageBox>

  8. #include <QtSql/QSqlRecord>

  9. #include <QDebug>

  10.  
  11. #include "KSDemoDlg.h"

  12.  
  13.  
  14. /**************************************************************************

  15. * 函數名稱:KSDemoDlg

  16. * 函數功能:用戶管理對話框構造函數

  17. * 輸入參數:無

  18. * 輸出參數:無

  19. * 返回數值:void

  20. * 建立人員:

  21. * 建立時間:2017-11-15

  22. * 修改人員:

  23. * 修改時間:

  24. **************************************************************************/

  25. KSDemoDlg::KSDemoDlg(QString databaseName, QString dataTableName, QWidget *parent):QDialog(parent, Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint | Qt::WindowStaysOnTopHint),

  26. m_Group(this), m_PrimaryKeyLabel(this), m_PrimaryKeyLineEdit(this), m_QueryButton(this), m_NewButton(this), m_UpdateButton(this), m_DeleteButton(this), m_TabView(NULL),m_model(NULL),

  27. m_OKButton(this),m_CancelButton(this), m_DBName(databaseName), m_DBTableName(dataTableName), m_operator(-1)

  28. {

  29. //打開數據庫

  30.  
  31. m_db = QSqlDatabase::addDatabase("QSQLITE");

  32. m_db.setDatabaseName(QApplication::applicationDirPath() + "/config/" + databaseName);

  33. if (!m_db.open())

  34. {

  35. m_DBName = "";

  36. m_DBTableName = "";

  37. }

  38.  
  39. m_model = new QSqlTableModel(this, m_db);

  40. m_model->setTable(m_DBTableName);

  41. m_model->setEditStrategy(QSqlTableModel::OnManualSubmit); //手動提交後才修改

  42.  
  43. m_model->select();

  44.  
  45. m_TabView = new QTableView(this);

  46. m_TabView->setEditTriggers(QAbstractItemView::NoEditTriggers); //設置內容不可編輯

  47.  
  48. /*************關聯槽函數*********************/

  49. connect(&m_NewButton, SIGNAL(clicked()), this, SLOT(onNewButtonClicked()));

  50. connect(&m_QueryButton, SIGNAL(clicked()), this, SLOT(onQueryButtonClicked()));

  51. connect(&m_UpdateButton, SIGNAL(clicked()), this, SLOT(onUpdateButtonClicked()));

  52. connect(&m_DeleteButton, SIGNAL(clicked()), this, SLOT(onDeleteButtonClicked()));

  53. connect(&m_PrimaryKeyLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(onPrimaryKeyLineEditEmpty(const QString &)));

  54. connect(m_TabView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onCurrentTableViewClicked(const QModelIndex &)));

  55. connect(&m_OKButton, SIGNAL(clicked()), this, SLOT(onOKButtonClicked()));

  56. connect(&m_CancelButton, SIGNAL(clicked()), this, SLOT(onCancelButtonClicked()));

  57.  
  58. /*************模型關聯視圖*******************/

  59.  
  60. m_TabView->setModel(m_model);

  61.  
  62. /*************選中行爲爲整行選中*************/

  63. m_TabView->setSelectionBehavior(QAbstractItemView::SelectRows);

  64.  
  65. /*************對話框窗體初始化***************/

  66. UiInit();

  67.  
  68. /*************對話框窗體初始化***************/

  69. setFixedSize(600, 400);

  70. setWindowTitle(QStringLiteral("用戶管理"));

  71. }

  72.  
  73. /**************************************************************************

  74. * 函數名稱:UiInit

  75. * 函數功能:用戶管理對話框界面初始化

  76. * 輸入參數:無

  77. * 輸出參數:無

  78. * 返回數值:void

  79. * 建立人員:

  80. * 建立時間:2017-11-15

  81. * 修改人員:

  82. * 修改時間:

  83. **************************************************************************/

  84.  
  85. void KSDemoDlg::UiInit()

  86. {

  87. m_PrimaryKeyLabel.setText(m_model->headerData(0, Qt::Horizontal).toString());

  88. m_NewButton.setText(QStringLiteral("增長"));

  89. m_QueryButton.setText(QStringLiteral("查詢"));

  90. m_UpdateButton.setText(QStringLiteral("修改"));

  91. m_DeleteButton.setText(QStringLiteral("刪除"));

  92. m_UpdateButton.setEnabled(true);

  93.  
  94. m_OKButton.setText(QStringLiteral("肯定"));

  95. m_CancelButton.setText(QStringLiteral("取消"));

  96.  
  97. /**************靈活增長界面右側數據顯示形式******************/

  98. for(int i=0; i<m_model->columnCount(); i++)

  99. {

  100. m_infoLabelList.append(new QLabel(this));

  101. m_infoLabelList[i]->setText(m_model->headerData(i, Qt::Horizontal).toString());

  102.  
  103. m_infoEditList.append(new QLineEdit(this));

  104. m_infoEditList[i]->setEnabled(false);

  105. }

  106. m_OKButton.setEnabled(false);

  107. m_CancelButton.setEnabled(false);

  108.  
  109. /**************靈活增長界面右側數據顯示形式 END******************/

  110.  
  111. QHBoxLayout *TotalHBoxLayout = new QHBoxLayout();

  112. QVBoxLayout *TotalVBoxLayout = new QVBoxLayout();

  113.  
  114. QVBoxLayout *UserGroupVBoxLayout = new QVBoxLayout();

  115.  
  116. QHBoxLayout *UserEditHBoxLayout = new QHBoxLayout();

  117. QHBoxLayout *UserButtonHBoxLayout = new QHBoxLayout();

  118.  
  119. QFormLayout *UserPrimaryKeyFormLayout = new QFormLayout();

  120.  
  121. QFormLayout *UserSelectFormLayout = new QFormLayout();

  122. QHBoxLayout *UserSelectHBoxLayout = new QHBoxLayout();

  123. QVBoxLayout *UserSelectVBoxLayout = new QVBoxLayout();

  124.  
  125. /*****************界面右側group佈局******************/

  126. for (int i=0; i<m_infoLabelList.count(); i++)

  127. {

  128. UserSelectFormLayout->addRow( m_infoLabelList[i], m_infoEditList[i]);

  129. }

  130. UserSelectHBoxLayout->addWidget(&m_OKButton);

  131. UserSelectHBoxLayout->addWidget(&m_CancelButton);

  132.  
  133. UserSelectVBoxLayout->addLayout(UserSelectFormLayout);

  134. UserSelectVBoxLayout->addLayout(UserSelectHBoxLayout);

  135. UserSelectVBoxLayout->addStretch();

  136.  
  137. /*****************界面右側group佈局 END******************/

  138.  
  139. UserPrimaryKeyFormLayout->addRow(&m_PrimaryKeyLabel, &m_PrimaryKeyLineEdit);

  140.  
  141. UserEditHBoxLayout->addLayout(UserPrimaryKeyFormLayout);

  142. UserEditHBoxLayout->addWidget(&m_QueryButton);

  143. UserEditHBoxLayout->addStretch();

  144.  
  145. UserButtonHBoxLayout->addWidget(&m_NewButton);

  146. UserButtonHBoxLayout->addWidget(&m_UpdateButton);

  147. UserButtonHBoxLayout->addWidget(&m_DeleteButton);

  148.  
  149. UserGroupVBoxLayout->addLayout(UserEditHBoxLayout);

  150. UserGroupVBoxLayout->addLayout(UserButtonHBoxLayout);

  151.  
  152. m_Group.setLayout(UserGroupVBoxLayout);

  153.  
  154. TotalVBoxLayout->addWidget(&m_Group);

  155. TotalVBoxLayout->addWidget(m_TabView);

  156.  
  157. TotalHBoxLayout->addLayout(TotalVBoxLayout, 3);

  158. TotalHBoxLayout->addLayout(UserSelectVBoxLayout, 1);

  159.  
  160. setLayout(TotalHBoxLayout);

  161. }

  162.  
  163. /**************************************************************************

  164. * 函數名稱:onNewUserButtonClick

  165. * 函數功能:用戶管理對話框界新增用戶按鈕槽函數

  166. * 輸入參數:無

  167. * 輸出參數:無

  168. * 返回數值:void

  169. * 建立人員:

  170. * 建立時間:2017-11-15

  171. * 修改人員:

  172. * 修改時間:

  173. **************************************************************************/

  174. void KSDemoDlg::onNewButtonClicked()

  175. {

  176. for (int i=0; i<m_infoEditList.count(); i++)

  177. {

  178. m_infoEditList[i]->setEnabled(true);

  179. }

  180. m_operator = INSERT;

  181. m_OKButton.setEnabled(true);

  182. m_CancelButton.setEnabled(true);

  183. }

  184.  
  185. /**************************************************************************

  186. * 函數名稱:onQueryUserButtonClick

  187. * 函數功能:用戶管理對話框界查詢用戶按鈕槽函數

  188. * 輸入參數:無

  189. * 輸出參數:無

  190. * 返回數值:void

  191. * 建立人員:廖明勝

  192. * 建立時間:2017-11-15

  193. * 修改人員:

  194. * 修改時間:

  195. **************************************************************************/

  196. void KSDemoDlg::onQueryButtonClicked()

  197. {

  198. QString toFind = m_PrimaryKeyLineEdit.text();

  199.  
  200. QString ID = m_model->headerData(0, Qt::Horizontal).toString();

  201.  
  202. m_model->setFilter(ID + "=\'" + toFind + "\'");

  203.  
  204. m_model->select();

  205. }

  206.  
  207. /**************************************************************************

  208. * 函數名稱:onUpdateButtonClicked

  209. * 函數功能:用戶管理對話框界修改用戶按鈕槽函數

  210. * 輸入參數:無

  211. * 輸出參數:無

  212. * 返回數值:void

  213. * 建立人員:

  214. * 建立時間:2017-11-15

  215. * 修改人員:

  216. * 修改時間:

  217. **************************************************************************/

  218. void KSDemoDlg::onUpdateButtonClicked()

  219. {

  220. int toUpdate = m_TabView->currentIndex().row();

  221.  
  222. QSqlRecord recode = m_model->record(toUpdate);

  223.  
  224. for (int i=0; i<recode.count(); i++)

  225. {

  226. m_infoEditList[i]->setEnabled(true);

  227. m_infoEditList[i]->setText(recode.value(i).toString());

  228. }

  229. m_operator = UPDATE;

  230. m_OKButton.setEnabled(true);

  231. m_CancelButton.setEnabled(true);

  232.  
  233. }

  234.  
  235. /**************************************************************************

  236. * 函數名稱:onDeleteButtonClicked

  237. * 函數功能:用戶管理對話框界刪除用戶按鈕槽函數

  238. * 輸入參數:無

  239. * 輸出參數:無

  240. * 返回數值:void

  241. * 建立人員:

  242. * 建立時間:2017-11-15

  243. * 修改人員:

  244. * 修改時間:

  245. **************************************************************************/

  246. void KSDemoDlg::onDeleteButtonClicked()

  247. {

  248. int toDelRow = m_TabView->currentIndex().row();

  249.  
  250. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("肯定要刪除") + m_model->data(m_model->index(toDelRow, 0)).toString() + QStringLiteral("嗎?"), QMessageBox::Ok|QMessageBox::No))

  251. {

  252. m_model->removeRow(toDelRow);

  253. m_model->submitAll();

  254. }

  255.  
  256. m_model->select();

  257. }

  258.  
  259. /**************************************************************************

  260. * 函數名稱:onUserNameEditEmpty

  261. * 函數功能:當m_UserNameEdit編輯框爲空時,顯示全部用戶

  262. * 輸入參數:無

  263. * 輸出參數:無

  264. * 返回數值:void

  265. * 建立人員:

  266. * 建立時間:2017-11-15

  267. * 修改人員:

  268. * 修改時間:

  269. **************************************************************************/

  270. void KSDemoDlg::onPrimaryKeyLineEditEmpty(const QString & text)

  271. {

  272. if (text.isEmpty())

  273. {

  274. m_model->setTable(m_DBTableName); //從新關聯數據庫表,這樣才能查詢整個表

  275. m_model->select();

  276. }

  277. }

  278.  
  279. /**************************************************************************

  280. * 函數名稱:onCurrentTableViewActived

  281. * 函數功能:m_TableView視圖選取當前行槽函數,內容映射到右側用戶編輯中

  282. * 輸入參數:無

  283. * 輸出參數:無

  284. * 返回數值:void

  285. * 建立人員:

  286. * 建立時間:2017-11-15

  287. * 修改人員:

  288. * 修改時間:

  289. **************************************************************************/

  290. void KSDemoDlg::onCurrentTableViewClicked(const QModelIndex & index)

  291. {

  292. if (!m_OKButton.isEnabled() || (INSERT == m_operator)) //只有可編輯而且操做爲修改操做時才映射內容

  293. {

  294. return;

  295. }

  296.  
  297. int currentRow = index.row();

  298.  
  299. QSqlRecord recode = m_model->record(currentRow);

  300.  
  301. for (int i=0; i<recode.count(); i++)

  302. {

  303. m_infoEditList[i]->setEnabled(true);

  304. m_infoEditList[i]->setText(recode.value(i).toString());

  305. }

  306. }

  307.  
  308. /**************************************************************************

  309. * 函數名稱:onOKButtonClicked

  310. * 函數功能:OKButton點擊槽函數,肯定修改數據庫

  311. * 輸入參數:無

  312. * 輸出參數:無

  313. * 返回數值:void

  314. * 建立人員:

  315. * 建立時間:2017-11-15

  316. * 修改人員:

  317. * 修改時間:

  318. **************************************************************************/

  319. void KSDemoDlg::onOKButtonClicked()

  320. {

  321. for (int i=0; i<m_infoEditList.count(); i++)

  322. {

  323. if (m_infoEditList[i]->text().isEmpty())

  324. {

  325. QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("請將內容填寫完整"), QMessageBox::Ok);

  326. return;

  327. }

  328. }

  329.  
  330. switch (m_operator)

  331. {

  332. case INSERT:

  333. {

  334. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("請肯定是否增長"), QMessageBox::Ok|QMessageBox::No))

  335. {

  336. int col = m_model->columnCount();

  337. int row = m_model->rowCount();

  338. m_model->insertRow(row);

  339. for (int i=0; i<col; i++)

  340. {

  341. m_model->setData(m_model->index(row, i), m_infoEditList[i]->text());

  342. }

  343.  
  344. m_model->submitAll(); //提交修改

  345. }

  346. }

  347. break;

  348. case UPDATE:

  349. {

  350. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("請肯定是否修改"), QMessageBox::Ok|QMessageBox::No))

  351. {

  352. int col = m_model->columnCount();

  353. int CurrentRow = m_TabView->currentIndex().row();

  354. for (int i=0; i<col; i++)

  355. {

  356. m_model->setData(m_model->index(CurrentRow, i), m_infoEditList[i]->text());

  357. }

  358.  
  359. m_model->submitAll(); //提交修改

  360. }

  361. }

  362. break;

  363. default:

  364. break;

  365. }

  366.  
  367. for (int i=0; i<m_infoEditList.count(); i++)

  368. {

  369. m_infoEditList[i]->setText("");

  370. m_infoEditList[i]->setEnabled(false);

  371. }

  372.  
  373. m_model->select();

  374. m_OKButton.setEnabled(false);

  375. m_CancelButton.setEnabled(false);

  376. }

  377.  
  378. /**************************************************************************

  379. * 函數名稱:onCancelButtonClicked

  380. * 函數功能:OKButton點擊槽函數,不操做

  381. * 輸入參數:無

  382. * 輸出參數:無

  383. * 返回數值:void

  384. * 建立人員:

  385. * 建立時間:2017-11-15

  386. * 修改人員:

  387. * 修改時間:

  388. **************************************************************************/

  389. void KSDemoDlg::onCancelButtonClicked()

  390. {

  391. for (int i=0; i<m_infoEditList.count(); i++)

  392. {

  393. m_infoEditList[i]->setText("");

  394. m_infoEditList[i]->setEnabled(false);

  395. }

  396. m_OKButton.setEnabled(false);

  397. m_CancelButton.setEnabled(false);

  398. }

  399.  
  400. /**************************************************************************

  401. * 函數名稱:~KsUserManageDlg

  402. * 函數功能:用戶管理對話框析構函數

  403. * 輸入參數:無

  404. * 輸出參數:無

  405. * 返回數值:void

  406. * 建立人員:

  407. * 建立時間:2017-11-15

  408. * 修改人員:

  409. * 修改時間:

  410. **************************************************************************/

  411.  
  412. KSDemoDlg::~KSDemoDlg()

  413. {

  414. qDebug() << "KSDemoDlg::~KSDemoDlg()";

  415. m_db.close();

  416. }

  417.  

main函數
 

 
  1. #include "KsTestDemo.h"

  2. #include <QtWidgets/QApplication>

  3. #include <QCoreApplication>

  4.  
  5. #include "KSDemoDlg.h"

  6.  
  7. int main(int argc, char *argv[])

  8. {

  9. QApplication a(argc, argv);

  10.  
  11. KSDemoDlg dlg("CONFIG.db", "T_USER_MANAGE"); //這裏咱們在生成KSDemoDlg類的時候,在構造函數中傳入sqlite數據庫名CONFIG.DB和想要操做的表T_USER_MANAGE

  12.  
  13. dlg.show(); //顯示一下就OK

  14. return a.exec();

  15. }

上邊的 KSDemoDlg dlg("CONFIG.db", "T_USER_MANAGE");數據庫名跟表也能夠換成其餘的,代碼通用。

相關文章
相關標籤/搜索