要在C++中读取MySQL数据库并将结果显示为QML ListView的item,需要使用Qt提供的QSqlDatabase
和QSqlQueryModel
类。以下是一个简单的示例:
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。请注意,您需要根据实际情况修改连接参数和查询语句以适应您的情况。