QT读写Sqlite数据库的三种方式

Qt使用sqlite数据库及项目实战 本文详细介绍了在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. #include <QtSql/QSqlDatabase>
  5. #include <QtSql/QSqlQuery>
  6. #include <QtSql/QSqlRecord>
  7. typedef struct _testInfo //假定数据库存储内容
  8. {
  9. QString UsreName;
  10. QString IP;
  11. QString Port;
  12. QString PassWord;
  13. QString Type;
  14. }testInfo;
  15. int main(int argc, char *argv[])
  16. {
  17. QApplication a(argc, argv);
  18. QVector<testInfo> infoVect; //testInfo向量,用于存储数据库查询到的数据
  19. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  20. db.setDatabaseName(QApplication::applicationDirPath() + "/CONFIG/" + "CONFIG.db");
  21. if (!db.open())
  22. {
  23. return 0;
  24. }
  25. /**************************使用QSqlQuery操作数据库**************************/
  26. QSqlQuery query; //执行操作类对象
  27. //查询数据
  28. query.prepare("SELECT * FROM T_USER_MANAGE");
  29. query.exec(); //执行
  30. QSqlRecord recode = query.record(); //recode保存查询到一些内容信息,如表头、列数等等
  31. int column = recode.count(); //获取读取结果的列数
  32. QString s1 = recode.fieldName(0); //获取第0列的列名
  33. while (query.next())
  34. {
  35. testInfo tmp;
  36. tmp.UsreName = query.value("UsreName").toString();
  37. tmp.IP = query.value("IP").toString();
  38. tmp.Port = query.value("Port").toString();
  39. tmp.PassWord = query.value("PassWord").toString();
  40. tmp.Type = query.value("Type").toString();
  41. infoVect.push_back(tmp); //将查询到的内容存到testInfo向量中
  42. }
  43. for (int i=0; i<infoVect.size(); i++) //打印输出
  44. {
  45. qDebug() << infoVect[i].UsreName << ":" \
  46. << infoVect[i].IP << ":" \
  47. << infoVect[i].Port << ":" \
  48. << infoVect[i].PassWord << ":" \
  49. << infoVect[i].Type;
  50. }
  51. //插入数据
  52. query.prepare("INSERT INTO T_USER_MANAGE (UsreName, IP, Port, PassWord, Type) VALUES (:UsreName, :IP, :Port, :PassWord, :Type)");
  53. query.bindValue(":UserName", "user4"); //给每个插入值标识符设定具体值
  54. query.bindValue(":IP", "192.168.1.5");
  55. query.bindValue(":Port", "5004");
  56. query.bindValue(":PassWord", "55555");
  57. query.bindValue(":Type", "operator");
  58. query.exec();
  59. //更改表中 UserName=user4 的Type属性为admin
  60. query.prepare("UPDATE T_USER_MANAGE SET Type='admin' WHERE UserName='user4'");
  61. query.exec();
  62. //删除表中 UserName=user4的用户信息
  63. query.prepare("DELETE FROM T_USER_MANAGE WHERE UserName='user4'");
  64. query.exec();
  65. #endif
  66. /**************************使用QSqlQuery操作数据库END***********************/

编译输出:

2、使用QSqlQueryModel来访问

    QSqlQueryModel类带有Model字样,相信你已经猜到我们可以用他来关联试图,就能把数据库的内容显示到视图上,当然,常规的操作也是可以的,但是我们只说说怎么用这个类来把数据库中的内容显示到是视图中,这里我们选择的视图类为QTableView,直接上代码吧
 

  1. #include <QtWidgets/QApplication>
  2. #include <QCoreApplication>
  3. #include <QDebug>
  4. #include <QString>
  5. #include <QTableView>
  6. #include <QtSql/QSqlDatabase>
  7. #include <QtSql/QSqlQueryModel>
  8. int main(int argc, char *argv[])
  9. {
  10. QApplication a(argc, argv);
  11. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  12. db.setDatabaseName(QApplication::applicationDirPath() + "/CONFIG/" + "CONFIG.db");
  13. if (!db.open())
  14. {
  15. return 0;
  16. }
  17. QSqlQueryModel *model = new QSqlQueryModel;
  18. model->setQuery("SELECT * FROM T_USER_MANAGE", db); //从给定的数据库db执行sql操作, db需预先制定并打开
  19. int column = model->columnCount(); //获取列数
  20. int row = model->rowCount(); //获取行数
  21. model->setHeaderData(0, Qt::Horizontal, QStringLiteral("用户名")); //设置表头,如不设置则使用数据库中的默认表头
  22. model->setHeaderData(1, Qt::Horizontal, QStringLiteral("IP地址"));
  23. model->setHeaderData(2, Qt::Horizontal, QStringLiteral("端口"));
  24. model->setHeaderData(3, Qt::Horizontal, QStringLiteral("密码"));
  25. model->setHeaderData(4, Qt::Horizontal, QStringLiteral("用户类型"));
  26. QTableView *view = new QTableView; //定义视图,只能用于显示,不能修改数据库
  27. view->setFixedSize(500, 200);
  28. view->setModel(model);
  29. view->show();
  30. return a.exec();
  31. }

编译运行一下:

3、最后使用QSqlTableModel来访问
      最后我们来说说使用QSqlTableModel这个类去操作Sqlite数据库,这个类比上两个封装的更彻底,即使我们不懂SQL语言,也能实现对Sqlite数据库的操作,并且这个类也可以通过视图来显示修改数据库内容,这里我就拿这个类做了个用户管理模块,其实也可以通用与其他任何一个模块,只要在生成对象时传入sqlite的数据库名及要操作的表名即可。

    在这个例子中,我实现了一个KSDemoDlg类,其实是一个对话框类,里边包含了sqlite数据库的显示、修改等等功能,首先来看下效果(常规的增删改查功能都有):

当我们点击增加、修改时,右边的编辑框便为可编辑状态(说明下,右边的编辑框是随着加载的数据库表变化而变化的,简而言之就是可以不做修改就能操作别的Sqlite数据库),完毕确定后便写进数据库,同时也在左边的表格中显示

头文件:

  1. #ifndef __KSDEMODLG_H__
  2. #define __KSDEMODLG_H__
  3. #include <QDialog>
  4. #include <QPushButton>
  5. #include <QLineEdit>
  6. #include <QLabel>
  7. #include <QComboBox>
  8. #include <QGroupBox>
  9. #include <QTableView>
  10. #include <QtSql/QSqlTableModel>
  11. #include <QtSql/QSqlDatabase>
  12. class KSDemoDlg : public QDialog
  13. {
  14. Q_OBJECT
  15. enum {UPDATE, INSERT};
  16. int m_operator;
  17. public:
  18. explicit KSDemoDlg(QString databaseName, QString dataTableName, QWidget *parent = 0 );
  19. ~KSDemoDlg();
  20. private:
  21. void UiInit();
  22. protected slots:
  23. void onNewButtonClicked();
  24. void onQueryButtonClicked();
  25. void onUpdateButtonClicked();
  26. void onDeleteButtonClicked();
  27. void onPrimaryKeyLineEditEmpty(const QString & text);
  28. void onCurrentTableViewClicked(const QModelIndex & index);
  29. void onOKButtonClicked();
  30. void onCancelButtonClicked();
  31. private:
  32. QSqlDatabase m_db;
  33. QString m_DBName;
  34. QString m_DBTableName;
  35. private:
  36. QTableView* m_TabView;
  37. QSqlTableModel* m_model;
  38. private:
  39. QList<QLineEdit*> m_infoEditList;
  40. QList<QLabel*> m_infoLabelList;
  41. QPushButton m_OKButton;
  42. QPushButton m_CancelButton;
  43. private:
  44. /*所有用户信息容器组*/
  45. QGroupBox m_Group;
  46. QLabel m_PrimaryKeyLabel;
  47. QLineEdit m_PrimaryKeyLineEdit;
  48. QPushButton m_QueryButton;
  49. QPushButton m_NewButton;
  50. QPushButton m_UpdateButton;
  51. QPushButton m_DeleteButton;
  52. /*所选择用户信息容器组*/
  53. QGroupBox m_SelectGroup;
  54. };
  55. #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. #include "KSDemoDlg.h"
  11. /**************************************************************************
  12. * 函数名称:KSDemoDlg
  13. * 函数功能:用户管理对话框构造函数
  14. * 输入参数:无
  15. * 输出参数:无
  16. * 返回数值:void
  17. * 创建人员:
  18. * 创建时间:2017-11-15
  19. * 修改人员:
  20. * 修改时间:
  21. **************************************************************************/
  22. KSDemoDlg::KSDemoDlg(QString databaseName, QString dataTableName, QWidget *parent):QDialog(parent, Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint | Qt::WindowStaysOnTopHint),
  23. 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),
  24. m_OKButton(this),m_CancelButton(this), m_DBName(databaseName), m_DBTableName(dataTableName), m_operator(-1)
  25. {
  26. //打开数据库
  27. m_db = QSqlDatabase::addDatabase("QSQLITE");
  28. m_db.setDatabaseName(QApplication::applicationDirPath() + "/config/" + databaseName);
  29. if (!m_db.open())
  30. {
  31. m_DBName = "";
  32. m_DBTableName = "";
  33. }
  34. m_model = new QSqlTableModel(this, m_db);
  35. m_model->setTable(m_DBTableName);
  36. m_model->setEditStrategy(QSqlTableModel::OnManualSubmit); //手动提交后才修改
  37. m_model->select();
  38. m_TabView = new QTableView(this);
  39. m_TabView->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置内容不可编辑
  40. /*************关联槽函数*********************/
  41. connect(&m_NewButton, SIGNAL(clicked()), this, SLOT(onNewButtonClicked()));
  42. connect(&m_QueryButton, SIGNAL(clicked()), this, SLOT(onQueryButtonClicked()));
  43. connect(&m_UpdateButton, SIGNAL(clicked()), this, SLOT(onUpdateButtonClicked()));
  44. connect(&m_DeleteButton, SIGNAL(clicked()), this, SLOT(onDeleteButtonClicked()));
  45. connect(&m_PrimaryKeyLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(onPrimaryKeyLineEditEmpty(const QString &)));
  46. connect(m_TabView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onCurrentTableViewClicked(const QModelIndex &)));
  47. connect(&m_OKButton, SIGNAL(clicked()), this, SLOT(onOKButtonClicked()));
  48. connect(&m_CancelButton, SIGNAL(clicked()), this, SLOT(onCancelButtonClicked()));
  49. /*************模型关联视图*******************/
  50. m_TabView->setModel(m_model);
  51. /*************选中行为为整行选中*************/
  52. m_TabView->setSelectionBehavior(QAbstractItemView::SelectRows);
  53. /*************对话框窗体初始化***************/
  54. UiInit();
  55. /*************对话框窗体初始化***************/
  56. setFixedSize(600, 400);
  57. setWindowTitle(QStringLiteral("用户管理"));
  58. }
  59. /**************************************************************************
  60. * 函数名称:UiInit
  61. * 函数功能:用户管理对话框界面初始化
  62. * 输入参数:无
  63. * 输出参数:无
  64. * 返回数值:void
  65. * 创建人员:
  66. * 创建时间:2017-11-15
  67. * 修改人员:
  68. * 修改时间:
  69. **************************************************************************/
  70. void KSDemoDlg::UiInit()
  71. {
  72. m_PrimaryKeyLabel.setText(m_model->headerData(0, Qt::Horizontal).toString());
  73. m_NewButton.setText(QStringLiteral("增加"));
  74. m_QueryButton.setText(QStringLiteral("查询"));
  75. m_UpdateButton.setText(QStringLiteral("修改"));
  76. m_DeleteButton.setText(QStringLiteral("删除"));
  77. m_UpdateButton.setEnabled(true);
  78. m_OKButton.setText(QStringLiteral("确定"));
  79. m_CancelButton.setText(QStringLiteral("取消"));
  80. /**************灵活增加界面右侧数据显示形式******************/
  81. for(int i=0; i<m_model->columnCount(); i++)
  82. {
  83. m_infoLabelList.append(new QLabel(this));
  84. m_infoLabelList[i]->setText(m_model->headerData(i, Qt::Horizontal).toString());
  85. m_infoEditList.append(new QLineEdit(this));
  86. m_infoEditList[i]->setEnabled(false);
  87. }
  88. m_OKButton.setEnabled(false);
  89. m_CancelButton.setEnabled(false);
  90. /**************灵活增加界面右侧数据显示形式 END******************/
  91. QHBoxLayout *TotalHBoxLayout = new QHBoxLayout();
  92. QVBoxLayout *TotalVBoxLayout = new QVBoxLayout();
  93. QVBoxLayout *UserGroupVBoxLayout = new QVBoxLayout();
  94. QHBoxLayout *UserEditHBoxLayout = new QHBoxLayout();
  95. QHBoxLayout *UserButtonHBoxLayout = new QHBoxLayout();
  96. QFormLayout *UserPrimaryKeyFormLayout = new QFormLayout();
  97. QFormLayout *UserSelectFormLayout = new QFormLayout();
  98. QHBoxLayout *UserSelectHBoxLayout = new QHBoxLayout();
  99. QVBoxLayout *UserSelectVBoxLayout = new QVBoxLayout();
  100. /*****************界面右侧group布局******************/
  101. for (int i=0; i<m_infoLabelList.count(); i++)
  102. {
  103. UserSelectFormLayout->addRow( m_infoLabelList[i], m_infoEditList[i]);
  104. }
  105. UserSelectHBoxLayout->addWidget(&m_OKButton);
  106. UserSelectHBoxLayout->addWidget(&m_CancelButton);
  107. UserSelectVBoxLayout->addLayout(UserSelectFormLayout);
  108. UserSelectVBoxLayout->addLayout(UserSelectHBoxLayout);
  109. UserSelectVBoxLayout->addStretch();
  110. /*****************界面右侧group布局 END******************/
  111. UserPrimaryKeyFormLayout->addRow(&m_PrimaryKeyLabel, &m_PrimaryKeyLineEdit);
  112. UserEditHBoxLayout->addLayout(UserPrimaryKeyFormLayout);
  113. UserEditHBoxLayout->addWidget(&m_QueryButton);
  114. UserEditHBoxLayout->addStretch();
  115. UserButtonHBoxLayout->addWidget(&m_NewButton);
  116. UserButtonHBoxLayout->addWidget(&m_UpdateButton);
  117. UserButtonHBoxLayout->addWidget(&m_DeleteButton);
  118. UserGroupVBoxLayout->addLayout(UserEditHBoxLayout);
  119. UserGroupVBoxLayout->addLayout(UserButtonHBoxLayout);
  120. m_Group.setLayout(UserGroupVBoxLayout);
  121. TotalVBoxLayout->addWidget(&m_Group);
  122. TotalVBoxLayout->addWidget(m_TabView);
  123. TotalHBoxLayout->addLayout(TotalVBoxLayout, 3);
  124. TotalHBoxLayout->addLayout(UserSelectVBoxLayout, 1);
  125. setLayout(TotalHBoxLayout);
  126. }
  127. /**************************************************************************
  128. * 函数名称:onNewUserButtonClick
  129. * 函数功能:用户管理对话框界新增用户按钮槽函数
  130. * 输入参数:无
  131. * 输出参数:无
  132. * 返回数值:void
  133. * 创建人员:
  134. * 创建时间:2017-11-15
  135. * 修改人员:
  136. * 修改时间:
  137. **************************************************************************/
  138. void KSDemoDlg::onNewButtonClicked()
  139. {
  140. for (int i=0; i<m_infoEditList.count(); i++)
  141. {
  142. m_infoEditList[i]->setEnabled(true);
  143. }
  144. m_operator = INSERT;
  145. m_OKButton.setEnabled(true);
  146. m_CancelButton.setEnabled(true);
  147. }
  148. /**************************************************************************
  149. * 函数名称:onQueryUserButtonClick
  150. * 函数功能:用户管理对话框界查询用户按钮槽函数
  151. * 输入参数:无
  152. * 输出参数:无
  153. * 返回数值:void
  154. * 创建人员:廖明胜
  155. * 创建时间:2017-11-15
  156. * 修改人员:
  157. * 修改时间:
  158. **************************************************************************/
  159. void KSDemoDlg::onQueryButtonClicked()
  160. {
  161. QString toFind = m_PrimaryKeyLineEdit.text();
  162. QString ID = m_model->headerData(0, Qt::Horizontal).toString();
  163. m_model->setFilter(ID + "=\'" + toFind + "\'");
  164. m_model->select();
  165. }
  166. /**************************************************************************
  167. * 函数名称:onUpdateButtonClicked
  168. * 函数功能:用户管理对话框界修改用户按钮槽函数
  169. * 输入参数:无
  170. * 输出参数:无
  171. * 返回数值:void
  172. * 创建人员:
  173. * 创建时间:2017-11-15
  174. * 修改人员:
  175. * 修改时间:
  176. **************************************************************************/
  177. void KSDemoDlg::onUpdateButtonClicked()
  178. {
  179. int toUpdate = m_TabView->currentIndex().row();
  180. QSqlRecord recode = m_model->record(toUpdate);
  181. for (int i=0; i<recode.count(); i++)
  182. {
  183. m_infoEditList[i]->setEnabled(true);
  184. m_infoEditList[i]->setText(recode.value(i).toString());
  185. }
  186. m_operator = UPDATE;
  187. m_OKButton.setEnabled(true);
  188. m_CancelButton.setEnabled(true);
  189. }
  190. /**************************************************************************
  191. * 函数名称:onDeleteButtonClicked
  192. * 函数功能:用户管理对话框界删除用户按钮槽函数
  193. * 输入参数:无
  194. * 输出参数:无
  195. * 返回数值:void
  196. * 创建人员:
  197. * 创建时间:2017-11-15
  198. * 修改人员:
  199. * 修改时间:
  200. **************************************************************************/
  201. void KSDemoDlg::onDeleteButtonClicked()
  202. {
  203. int toDelRow = m_TabView->currentIndex().row();
  204. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("确定要删除") + m_model->data(m_model->index(toDelRow, 0)).toString() + QStringLiteral("吗?"), QMessageBox::Ok|QMessageBox::No))
  205. {
  206. m_model->removeRow(toDelRow);
  207. m_model->submitAll();
  208. }
  209. m_model->select();
  210. }
  211. /**************************************************************************
  212. * 函数名称:onUserNameEditEmpty
  213. * 函数功能:当m_UserNameEdit编辑框为空时,显示所有用户
  214. * 输入参数:无
  215. * 输出参数:无
  216. * 返回数值:void
  217. * 创建人员:
  218. * 创建时间:2017-11-15
  219. * 修改人员:
  220. * 修改时间:
  221. **************************************************************************/
  222. void KSDemoDlg::onPrimaryKeyLineEditEmpty(const QString & text)
  223. {
  224. if (text.isEmpty())
  225. {
  226. m_model->setTable(m_DBTableName); //重新关联数据库表,这样才能查询整个表
  227. m_model->select();
  228. }
  229. }
  230. /**************************************************************************
  231. * 函数名称:onCurrentTableViewActived
  232. * 函数功能:m_TableView视图选取当前行槽函数,内容映射到右侧用户编辑中
  233. * 输入参数:无
  234. * 输出参数:无
  235. * 返回数值:void
  236. * 创建人员:
  237. * 创建时间:2017-11-15
  238. * 修改人员:
  239. * 修改时间:
  240. **************************************************************************/
  241. void KSDemoDlg::onCurrentTableViewClicked(const QModelIndex & index)
  242. {
  243. if (!m_OKButton.isEnabled() || (INSERT == m_operator)) //只有可编辑并且操作为修改操作时才映射内容
  244. {
  245. return;
  246. }
  247. int currentRow = index.row();
  248. QSqlRecord recode = m_model->record(currentRow);
  249. for (int i=0; i<recode.count(); i++)
  250. {
  251. m_infoEditList[i]->setEnabled(true);
  252. m_infoEditList[i]->setText(recode.value(i).toString());
  253. }
  254. }
  255. /**************************************************************************
  256. * 函数名称:onOKButtonClicked
  257. * 函数功能:OKButton点击槽函数,确定修改数据库
  258. * 输入参数:无
  259. * 输出参数:无
  260. * 返回数值:void
  261. * 创建人员:
  262. * 创建时间:2017-11-15
  263. * 修改人员:
  264. * 修改时间:
  265. **************************************************************************/
  266. void KSDemoDlg::onOKButtonClicked()
  267. {
  268. for (int i=0; i<m_infoEditList.count(); i++)
  269. {
  270. if (m_infoEditList[i]->text().isEmpty())
  271. {
  272. QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("请将内容填写完整"), QMessageBox::Ok);
  273. return;
  274. }
  275. }
  276. switch (m_operator)
  277. {
  278. case INSERT:
  279. {
  280. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("请确定是否增加"), QMessageBox::Ok|QMessageBox::No))
  281. {
  282. int col = m_model->columnCount();
  283. int row = m_model->rowCount();
  284. m_model->insertRow(row);
  285. for (int i=0; i<col; i++)
  286. {
  287. m_model->setData(m_model->index(row, i), m_infoEditList[i]->text());
  288. }
  289. m_model->submitAll(); //提交修改
  290. }
  291. }
  292. break;
  293. case UPDATE:
  294. {
  295. if (QMessageBox::Ok == QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("请确定是否修改"), QMessageBox::Ok|QMessageBox::No))
  296. {
  297. int col = m_model->columnCount();
  298. int CurrentRow = m_TabView->currentIndex().row();
  299. for (int i=0; i<col; i++)
  300. {
  301. m_model->setData(m_model->index(CurrentRow, i), m_infoEditList[i]->text());
  302. }
  303. m_model->submitAll(); //提交修改
  304. }
  305. }
  306. break;
  307. default:
  308. break;
  309. }
  310. for (int i=0; i<m_infoEditList.count(); i++)
  311. {
  312. m_infoEditList[i]->setText("");
  313. m_infoEditList[i]->setEnabled(false);
  314. }
  315. m_model->select();
  316. m_OKButton.setEnabled(false);
  317. m_CancelButton.setEnabled(false);
  318. }
  319. /**************************************************************************
  320. * 函数名称:onCancelButtonClicked
  321. * 函数功能:OKButton点击槽函数,不操作
  322. * 输入参数:无
  323. * 输出参数:无
  324. * 返回数值:void
  325. * 创建人员:
  326. * 创建时间:2017-11-15
  327. * 修改人员:
  328. * 修改时间:
  329. **************************************************************************/
  330. void KSDemoDlg::onCancelButtonClicked()
  331. {
  332. for (int i=0; i<m_infoEditList.count(); i++)
  333. {
  334. m_infoEditList[i]->setText("");
  335. m_infoEditList[i]->setEnabled(false);
  336. }
  337. m_OKButton.setEnabled(false);
  338. m_CancelButton.setEnabled(false);
  339. }
  340. /**************************************************************************
  341. * 函数名称:~KsUserManageDlg
  342. * 函数功能:用户管理对话框析构函数
  343. * 输入参数:无
  344. * 输出参数:无
  345. * 返回数值:void
  346. * 创建人员:
  347. * 创建时间:2017-11-15
  348. * 修改人员:
  349. * 修改时间:
  350. **************************************************************************/
  351. KSDemoDlg::~KSDemoDlg()
  352. {
  353. qDebug() << "KSDemoDlg::~KSDemoDlg()";
  354. m_db.close();
  355. }

main函数
 

  1. #include "KsTestDemo.h"
  2. #include <QtWidgets/QApplication>
  3. #include <QCoreApplication>
  4. #include "KSDemoDlg.h"
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. KSDemoDlg dlg("CONFIG.db", "T_USER_MANAGE"); //这里我们在生成KSDemoDlg类的时候,在构造函数中传入sqlite数据库名CONFIG.DB和想要操作的表T_USER_MANAGE
  9. dlg.show(); //显示一下就OK
  10. return a.exec();
  11. }

上边的 KSDemoDlg dlg("CONFIG.db", "T_USER_MANAGE");数据库名跟表也可以换成其他的,代码通用。

QT读写Sqlite数据库三种方式 阅读详情

相关推荐

SQLite 安装与使用

SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准。SQLite在使用前不需要安装设置,不需要进程来启动、停止或配置,而其他大多数SQL数据库引擎是作为一个单独的服务器进程,被程序使用某种内部进程通信(典型的是TCP/IP),完成发送请求到服务器和接收查询结果的工作,SQLite不采用这种工作方式。使用SQLite时,访问数据库的程序直接从磁盘上的数据库文件读写,没有中间的服务器进程。使用SQLite一般只需要带上一个dll......

IT小郭的技术博客 4万+

Qt中操作SQLite数据库

0.前言 SQLite是一款开源、轻量级、跨平台的数据库,无需server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。 1.驱动 Qt SQL模块使用驱动程序插件(plugins)与不同的数据库API进行通信。由于Qt的SQL模块API与数据库无关,因此所有特定于数据库的代码都包含在这些驱动程序中。Qt提供了几个驱动程序,也可以添加其他驱动程序。提供驱动程序源代码,可用作编写自己的驱动程序的模型。 QtCreator在*.pro中引入sq

龚建波 2万+

2024年物联网嵌入式最新QT读写Sqlite数据库的三种方式(1),2024年最新物联网嵌入式开发面试题2024中高级

m_UpdateButton.setText(QStringLiteral(“修改”));m_DeleteButton.setText(QStringLiteral(“删除”));m_QueryButton.setText(QStringLiteral(“查询”));m_NewButton.setText(QStringLiteral(“增加”));setWindowTitle(QStringLiteral(“用户管理”));函数功能:用户管理对话框界修改用户按钮槽函数。创建时间:2017-11-15。

2401_85012262的博客 683

[QT编程系列-38]:数据存储 - SQLite数据库存储与操作

QT 提供了对 SQLite 数据库的支持,通过 QT 的相关类和方法,可以方便地进行SQLite数据库的连接、查询和操作。1.2 SQLite不支持网络连接SQLite 是一种嵌入式数据库引擎,通常用于本地应用程序中,它被设计为本地文件数据库并不直接提供网络连接功能。因此,SQLite 本身不支持直接通过网络连接到数据库。然而,可以通过其他方法实现通过网络连接到 SQLite 数据库的功能。

文火冰糖(王文兵)的博客 4572

Qt多线程操作sqlite数据库

通过锁解决了sqlite数据库多线程操作的写冲突和读写冲突,锁是有消耗的,但很小,我实测6-19ms,这个消耗算是可以了。多线程操作sqlite数据库,关键之处就是在于加锁,保存同时只有一个写的操作;读的操作是可以并发的;有写的操作,读的操作也必须等待,可以说,同时只有一个写操作,无其它操作,通过锁就达到了这一个目的。如果一个线程正在写,另一个线程也要写,怎么办,锁就会让另一个线程等待前一个线程写完,自己再写。锁的本质意义就是保证了,锁的区域,只有一个写线程在访问,而读的线程,可以并发。

如山石的系统虚拟化之路 2620

QT sqlite3数据库读取、容器操作、文件读写——学习笔记。

直接上代码 #include "dbpoi.h" #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QApplicati

swqqcs的专栏 1万+

QT读写Sqlite

在.pro文件中添加QT += sql 执行qmake QT对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下QT对Sqlite这个数据库的读写,Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据是相当的方便,Qt本身已经自带了Sqlite的驱动,直接使用相关的类库即可,这篇我们主要来说明QT访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库

peiwang245的博客 492

【Qt】数据库编程(SQLite API)

是 SQLite 库中的一个重要结构体,它代表了一个预编译的 SQL 语句对象,也被称为 “准备好的语句(prepared statement)”。用于指定项目链接时需要包含的库文件,这里链接的是 SQLite3 数据库的库文件。返回SQLITE_DONE表示执行完成,无数据。如果只是执行SQL,则该函数只调用一次即可。2、col-列位置,预编译 SQL 语句对象指针。表示绑定成功,否则失败。参数: sqlite3。要绑定的文本数据指针。表示准备好一行的数据。5.预编译SQL语句。语句未使用部分的指针。

weixin_74154742的博客 1149

QT学习:Qt操作数据库

本节由不同Qt类支撑的三部分组成,QtSql模块层次结构如下图所示: 一、Qt操作SQLite数据库 Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来具有以下优点。 (1)SQLite的设计目的是实现嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用在非常广泛的领域内。 (2)SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无须持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQ

weixin_42374938的博客 7592

星链V3的2048条波束与1Tbps:多波束相控阵的工程代价

低轨卫星通信的容量提升,核心在于多波束相控阵天线的空间复用能力。相控阵通过控制大量天线单元的相位,可在同一阵面同时形成多条独立指向的波束,从而在有限频谱内成倍提升系统容量。星链V3宣称的2048条波束与1 Tbps汇聚吞吐量,正是基于这一原理:更多波束意味着更高的频率复用系数和更灵活的资源调度。但工程实现并非免费午餐,数字背后是供电、散热、重量、发射成本及运维复杂度的急剧攀升。从用户侧看,更精细的波束也带来切换频繁、低仰角衰减等新挑战。本文从多波束相控阵的基础原理出发,拆解波束形成、频谱复用和动态调度的工程

weixin_33462167的博客 347

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8024

QT 之SQLite数据库

分步写,利用prepare()函数,再使用exec()

Lee1989 3356

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案

本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。

milk8的博客 446

Qt5之使用sqlite3数据库

1、效果2、添加 sql引用.pro文件 添加 下面的引用QT += sql 3、创建数据库链接// 数据库连接 QSqlDatabase sqliteDatabase;4、保存数据库连接我使用了自定义数据库链接名 // 解除对数据库的默认连接 bool isContain = QSqlDatabase::contains(databaseConnectionNam...

知其所以然 1万+

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6432

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1924

QT读写Sqlite数据库

QT读写Sqlite数据库  //.h /******************************************************************************** Date    : 2010-05-08** Author  : furtherchan** If you have any questions , please cont

FurtherChan 2694

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 248

QT6实现创建与操作sqlite数据库三种方式方式对比(二)

Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种QSqlTableModel,根本就不需要开发者懂SQL语言,也能操作Sqlite数据库。

热土程序园,利他愉己~ 1169

深度学习在传感器数据分析中的创新应用

传感器是物理世界与数字世界的“接口”,其生成的高维、时序、多源数据蕴含着设备状态、环境变化、用户行为等关键信息。传统传感器数据分析依赖手工特征工程与简单机器学习模型,难以应对复杂场景下的非线性、长程依赖与实时性需求。深度学习通过自动特征提取非线性建模与端到端学习,成为传感器数据处理的革命性工具。本文从概念基础理论框架架构设计实现机制到实际应用,系统拆解深度学习与传感器数据的融合逻辑,结合工业预测维护医疗健康监测智能交通等场景,揭示其技术边界与未来演化方向。

大数据洞察的博客 568

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

Qt下使用Sqlite数据库实现图像的读写显示

在Qt中使用Sqlite数据库可以保存很多类型的数据,其中还可以用来保存图像,这里对图像的保存和读取显示功能进行讲述,并将相关代码展现出来以便大家学习,如有错误之处,欢迎大家批评指正。

XCJandLL的博客 2127

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

QT操作Sqlite数据库的三种高效方式对比与实践

本文深入对比了QT操作Sqlite数据库的三种核心方式:QSqlQuery、QSqlQueryModel和QSqlTableModel。通过分析各自的抽象层级、GUI集成度与适用场景,为开发者提供清晰的选型指南。QSqlQuery提供底层SQL控制,QSqlQueryModel适合只读数据展示,而QSqlTableModel则能实现免SQL的可编辑CRUD操作,帮助开发者根据项目需求选择最高效的数据库访问方案。

sea99的博客 1017

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 关于cocos2d-x-2.2.6和visual studio2010创建新工程的问题
下一篇: Express框架的使用教程
Summer_Chun
博客等级 码龄7年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值