zoukankan      html  css  js  c++  java
  • QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据

    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
                     grid.cellWidth; height: grid.cellHeight
                    Column
                    {
                        Image{ source: "pics/light_on.png";anchors.horizontalCenter: parent.horizontalCenter;  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 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操作仅仅运行一次,所以要想实时显示数据库中的数据,能够定时读取数据库以动态显示数据


  • 相关阅读:
    U3D+SVN: 两份相同资源放在不同目录下导致META的更改
    sceneManager.loadscene加载场景时不会主动去加载场景的依赖包,要手动加载或添加场景到build setting列表中
    android 屏幕适配
    android httpUrlConnection HttpClient
    android ndk
    android viewStub
    android 数字签名
    android mvc
    android OOM 内存溢出
    Aidl
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5414469.html
Copyright © 2011-2022 走看看