QT开发中文网

c++ 读取mysql并将结果表示为qml的listview的item

要在C++中读取MySQL数据库并将结果显示为QML ListView的item,需要使用Qt提供的QSqlDatabaseQSqlQueryModel类。以下是一个简单的示例:

MyModel.h:

#ifndef MYMODEL_H
#define MYMODEL_H

#include <QObject>
#include <QSqlQueryModel>

class MyModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit MyModel(QObject *parent = nullptr);

    // 重写data函数以获取模型数据(假设我们查询了一个名为name的列)
    QVariant data(const QModelIndex &index, int role) const override;

private:
    void queryData(); // 执行查询语句并将结果设置为模型数据
};

#endif // MYMODEL_H

MyModel.cpp:

#include "mymodel.h"
#include <QDebug>
#include <QSqlError>

MyModel::MyModel(QObject *parent) : QSqlQueryModel(parent)
{
    queryData();
}

void MyModel::queryData()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    // 设置连接参数(根据实际情况修改)
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("");
    db.setDatabaseName("testdb");

    if (db.open()) {
        qDebug() << "Connected to database.";

        // 执行查询语句(假设表名为users)
        setQuery("SELECT name FROM users");

        if (lastError().isValid()) {
            qWarning() << lastError().text();
        }
        
        db.close();

        qDebug() << "Data retrieved from database.";
    } else {
        qCritical() << "Error connecting to database.";
        qCritical() << db.lastError().text();
    }
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    // 重写data函数以获取模型数据(假设我们查询了一个名为name的列)
    if (role == Qt::DisplayRole) {
        return QSqlQueryModel::data(index).toString();
    }

    return QVariant();
}

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "mymodel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<MyModel>("com.example.MyModel", 1, 0, "MyModel"); // 注册自定义模型类型

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

Main.qml:

import QtQuick 2.0
import com.example.MyModel 1.0 // 导入自定义模型类型

Item {
    width: 400
    height: 600

    ListView {
        anchors.fill: parent
        id: listView

        model: MyModel {} // 使用自定义模型作为model属性

        delegate: Rectangle {
            width: parent.width
            height: 50
            color: index % 2 == 0 ? "#f0f0f0" : "#ffffff"

            Text {
                text: modelData // 假设我们查询了一个名为name的列,可以直接使用modelData表示该列的值。
                anchors.centerIn: parent
            }
        }
    }
}

在上述代码中,我们创建了一个自定义模型MyModel,它继承自QSqlQueryModel,并重写了data函数以获取模型数据。然后,在queryData函数中执行查询语句并将结果设置为模型数据。

在main函数中,我们注册了自定义模型类型并加载了QML文件。在QML文件中,我们使用自定义模型作为ListView的model属性,并使用自定义的delegate渲染每个item。

当您运行上述代码时,它将从MySQL数据库中检索数据并将其显示为ListView的item。请注意,您需要根据实际情况修改连接参数和查询语句以适应您的情况。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1664

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?