QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据



本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.



參考链接:

http://qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML



环境:

主机:WIN7

开发环境:Qt5.2.1

说明:

在QML中不能直接对数据库进行操作,所以将QSqlQueryModel封装成子类,作为属性给QML使用

效果图:





源码:

qml文件里负责数据托管显示的代码:

Component
{
id: msnDelegate
Item
{
id: wrapper
width: grid.cellWidth; height: grid.cellHeight
Column
{
Image{ source: "pics/light_on.png";anchors.horizontalCenter: parent.horizontalCenter; width: grid.cellWidth * 0.7; height: grid.cellHeight * 0.7}
Text { text: ctrl_id;anchors.horizontalCenter: parent.horizontalCenter; color: wrapper.GridView.isCurrentItem ? "red" :"blue" }
Text { text: name;anchors.horizontalCenter: parent.horizontalCenter; color: wrapper.GridView.isCurrentItem ? "red" :"blue" }
} MouseArea
{
anchors.fill: parent
onClicked: grid.currentIndex = index
}
}
}
GridView {
id:grid
//anchors.fill: parent
width: parent.width
height: parent.height - space1.height
anchors {top: space1.bottom;}
cellWidth: parent.width * 0.25
cellHeight: parent.width * 0.25
//model: listModel
model: myFirstModel
delegate: msnDelegate
highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
currentIndex: 2
//focus: true
}

C++代码:

sqlquerymodel.h

#ifndef SQLQUERYMODEL_H
#define SQLQUERYMODEL_H #include <QSqlQueryModel> class SqlQueryModel : public QSqlQueryModel
{
Q_OBJECT void generateRoleNames(); public:
explicit SqlQueryModel(QObject *parent = 0); void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase());
void setQuery(const QSqlQuery &query);
QVariant data(const QModelIndex &index, int role) const; virtual QHash<int, QByteArray> roleNames() const; signals: public slots: }; #endif // SQLQUERYMODEL_H

sqlquerymodel.cpp

#include "sqlquerymodel.h"
#include <QSqlRecord>
#include <QSqlField>
#include <QDebug> SqlQueryModel::SqlQueryModel(QObject *parent) :
QSqlQueryModel(parent)
{ } void SqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db)
{
QSqlQueryModel::setQuery(query,db);
generateRoleNames();
} void SqlQueryModel::setQuery(const QSqlQuery & query)
{
QSqlQueryModel::setQuery(query);
generateRoleNames();
} void SqlQueryModel::generateRoleNames()
{
QHash<int, QByteArray> roleNames;
for( int i = 0; i < record().count(); i++) {
roleNames[Qt::UserRole + i + 1] = record().fieldName(i).toUtf8();
}
//setRoleNames(roleNames);
} QHash<int, QByteArray> SqlQueryModel::roleNames() const
{
QHash<int, QByteArray> roleNames;
for( int i = 0; i < record().count(); i++) {
roleNames[Qt::UserRole + i + 1] = record().fieldName(i).toUtf8();
}
return roleNames;
} QVariant SqlQueryModel::data(const QModelIndex &index, int role) const
{
QVariant value = QSqlQueryModel::data(index, role);
if(role < Qt::UserRole)
{
value = QSqlQueryModel::data(index, role);
}
else
{
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}
return value;
}

主函数中数据关联的代码:

    SqlQueryModel *model1 = new SqlQueryModel(0);
model1->setQuery("SELECT * FROM ctrl_para"); QtQuick2ApplicationViewer viewer; viewer.rootContext()->setContextProperty("myFirstModel", model1); viewer.setMainQmlFile(QStringLiteral("qml/SH_User/base.qml"));
viewer.showExpanded();

注意:

query操作仅仅运行一次,所以要想实时显示数据库中的数据,能够定时读取数据库以动态显示数据

QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据的更多相关文章

  1. C#在listview控件中显示数据库数据

    一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 ...

  2. 在Linux环境下,将Solr部署到tomcat7中,导入Mysql数据库数据, 定时更新索引

    什么是solr solr是基于Lucene的全文搜索服务器,对Lucene进行了扩展优化. 准备工作 首先,去下载以下软件包: JDK8:jdk-8u60-linux-x64.tar.gz TOMCA ...

  3. Echarts中tooltip解决显示指定数据

    今天开发中遇到一个问题,echarts图表触摸x轴触发tooltip会将x轴上所有的数据展示出来,但是有些场合只需要展示某些数据就可以,并不需要全部展示,如下图: 这里警戒线因为需要开关,所以使用填充 ...

  4. webform中实现SQL Sever2008数据库数据分页查询

    1 分页     1.1         数据库中存储过程             已知 当前页  pageIndex  页容量 pageSize             求  总页数 pageCou ...

  5. php中如何解决显示数据库中的内容乱码

    第一步: 第二步:在代码开始处加一行

  6. 如何隐藏掉SQL Server中自带系统数据库,数据表,存储过程等显示文件,只显示用户的数据库,数据表等文件

    企业管理器了,---->   编辑该数据库的注册属性--->“常规”属性页下面-->“显示系统数据库和系统对象”的选项去掉

  7. 如何在jsp中显示数据库的内容

    用Eclipse tomcat新建一个JSP页面(一)介绍了如何创建一个web程序和第一个jsp页面,以及Eclipse需要的一些必要配置.今天,我们重点说一下如何从数据库中查询数据,并且在JSP页面 ...

  8. DirectSound---捕获音频、Qml/C++ 集成交互

    DirectSound的音频捕获原理和播放原理差不多,内部在一个缓冲区上循环写入捕获到的数据,并且提供notify通知功能. 1. 音频捕获 因为捕获流程和播放流程类似,我们就不在这里赘述了,只给出简 ...

  9. QML 与 C++ 交互之工厂方法

    QML 与 C++ 交互之工厂方法 先看例如以下的类声明,声明了一个产品类和工厂类. #include <QObject> class Productor : public QObject ...

随机推荐

  1. Java编程的逻辑 (52) - 抽象容器类

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. hdu 5053 (2014上海网赛L题 求立方和)

    题目大意:给你L到N的范围,要求你求这个范围内的所有整数的立方和. Sample Input2 //T1 32 5 Sample OutputCase #1: 36Case #2: 224 # inc ...

  3. 利用word的VBA,为代码统一表格宽度,底色及行号

    如果文档中的代码表格时,感觉还是很快速有用的. Sub HangHao() ' ' hanghao 宏 ' ' Dim parag As Paragraph Dim nLineNum: nLineNu ...

  4. 【BZOJ】3640: JC的小苹果

    题解 我们考虑列出期望方程组,\(dp[i][j]\)表示在第\(i\)个点血量为\(j\)的时候到达\(N\)点的概率,所有的\(dp[N][j]\)都是1,所有\(j < 0\)都是0 答案 ...

  5. 【LOJ】#2526. 「HAOI2018」苹果树

    题解 这计数题多水啊我怎么调了那么久啊 我不想老年化啊QAQ (注意这里的二叉树带标号) 考虑\(g[i]\)表示\(i\)个点二叉树所有节点的深度和,\(f[i]\)表示\(i\)个点的二叉树两两节 ...

  6. ThinkPHP 获取指定日期后第N个工作日具体日期

    思路: 1.获取到查询年份内所有工作日数据数组2.获取到查询开始日期在工作日的索引3.计算需查询日期索引4.获得查询日期 /*创建日期类型记录表格*/ CREATE TABLE `tb_workday ...

  7. 第一次使用Git上传本地项目到github上

    对于程序原来说都听说过GitHub,GitHub有许多开源的的项目和一些前沿的技术.因为自己在刚刚开始使用Git把自己写的一些小dome放到GitHub上遇到许多的坑,这么长时间过去了,想对第一次使用 ...

  8. 001.LVM简介

    一 概念 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻辑上集合,相 ...

  9. NLP自然语言处理系列5-支持向量机(SVM)

    1.什么是支持向量机 支持向量机(Support Vector Machine,SVM)是一种经典的分类模型,在早期的文档分类等领域有一定的应用.了解SVM的推导过程是一个充满乐趣和挑战的过程,耐心的 ...

  10. SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30001ms.

    SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after ...