• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Qt中使用SQLite數據庫

    標簽: QT

    前言

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

    用法

    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。如果需要使用自定義的連接名稱(如果程序需要處理多個數據庫文件的話就會這樣),則應該加入第二個參數,例如

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

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

    2. 打開數據庫

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

    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,第二列是名字,第三列是年齡。

    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()函數的參數中,例如:

        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()執行成功,則創建表格成功。

    例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數據庫。

    1、首先使用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***********************/

    編譯輸出:

    2、使用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. }

    編譯運行一下:

    3、最后使用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");數據庫名跟表也可以換成其他的,代碼通用。

    版權聲明:本文為u011555996原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/u011555996/article/details/108065572

    智能推薦

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    精品国产乱码久久久久久蜜桃不卡