qt C++ 创建一个横向循环滑动的按钮列表,读取SD卡media/game文件,将数据传到按钮
时间: 2024-09-11 19:04:14 浏览: 50
基于Qt和C++实现的高亮发光按钮控件+源码
在Qt中创建一个横向循环滑动的按钮列表,你可以使用QML(Qt Markup Language)结合C++后端来实现。首先,你需要准备一个QML文件,用于定义布局和按钮,然后在C++中处理SD卡上的文件并提供数据。以下是一个基本步骤的概述:
1. **设置项目结构**:
- 在你的Qt项目中,创建一个`.qml`文件,例如`main.qml`,用于设计用户界面。
2. **QML中的界面设计**:
```qml
import QtQuick 2.0
import QtQuick.Controls 2.0
// 创建一个水平居中容器
Column {
anchors.fill: parent
anchors.margins: 16
spacing: 8
// 使用ListView组件,设置循环滚动模式
ListView {
id: listView
anchors.centerIn: parent
orientation:.Qt.Horizontal
anchors.bottomMargin: parent.height / 2
flow: FlowLinearLayout.FlowStart
clip: true
delegate: Rectangle {
width: buttonWidth
height: buttonHeight
color: "lightgray"
Button {
text: data.name
anchors.fill: parent
onClicked: console.log("Button clicked: ", data.id)
}
}
model: sourceDataModel
}
}
```
3. **C++后端**:
- 在`.cpp`文件中,创建一个`QObject`子类,负责从SD卡读取数据,并为QML模型提供数据。
```cpp
#include <QQmlContext>
#include <QQmlProperty>
class DataSource : public QObject
{
Q_OBJECT
private:
QFileSystemModel fsModel;
QAbstractListModel* sourceDataModel;
public:
DataSource(QObject *parent) : QObject(parent)
{
fsModel.setRootPath("/media/game"); // SD卡路径替换为你实际的路径
setupSourceDataModel();
}
private slots:
void setupSourceDataModel()
{
// 模拟从SD卡读取文件列表
QDir dir("/media/game");
QStringList filePaths = dir.entryList(QDir::Files);
QHash<int, QString> data; // 这里存储你的数据,如键值对 {id, name}
foreach (const QString& filePath, filePaths) {
QFile file(filePath);
if (file.open(QIODevice::ReadOnly)) {
QString content = file.readAll();
// 解析content获取id和name等数据
int id = /*解析内容得到id*/;
QString name = /*解析内容得到name*/;
data[id] = name;
} else {
qDebug() << "Failed to open file: " << filePath;
}
}
QQmlEngine::setContextProperty("sourceDataModel", new QSortFilterProxyModel(this));
QQmlContext *context = QQmlEngine::current()->rootContext();
context->setContextProperty("data", data);
// 将fsModel转换为模型,以便与ListView绑定
sourceDataModel = new QSortFilterProxyModel(this);
sourceDataModel->setSource(&fsModel);
// 添加过滤条件(根据需要)
// sourceDataModel->setFilterRegExp(...);
}
};
```
4. **关联C++到QML**:
在`.cpp`文件中,确保`DataSource`实例被正确地添加到应用程序的核心`Application`中:
```cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
DataSource dataSource;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("dataSource", &dataSource);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
```
5. **运行应用**:
编译并运行你的Qt应用程序,它将在启动时显示一个带有按钮列表的界面,按钮的内容是从SD卡上读取的文件名。
阅读全文