Qt中,如何在treeView中展示mainWindow中连接的数据库表格,表格中选择其中三列作为结点按树形图展示,选中节点可定位,完整demo
时间: 2025-06-24 12:45:36 浏览: 9
### Qt TreeView 数据库表格 树形结构 展示 示例
以下是基于 `QTreeView` 和自定义模型 (`QAbstractItemModel`) 的完整 Demo,用于展示从数据库读取的数据并将其转换为树形结构。此代码展示了如何将三列表格数据映射到树节点,并支持通过选中节点来定位原始表格中的记录。
#### 主窗口类 MainWindow 实现
```cpp
#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVBoxLayout>
#include <QTreeView>
#include <QStandardItemModel>
class CustomTreeModel : public QAbstractItemModel {
public:
explicit CustomTreeModel(QObject *parent = nullptr);
~CustomTreeModel();
QVariant data(const QModelIndex &index, int role) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
private:
struct Node {
QString name;
QStringList childrenNames;
QVector<Node*> childrenNodes;
};
Node* root;
};
CustomTreeModel::CustomTreeModel(QObject *parent)
: QAbstractItemModel(parent), root(new Node{"Root", {}, {}} {}
CustomTreeModel::~CustomTreeModel() {
delete root;
}
QVariant CustomTreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return {};
auto node = static_cast<Node*>(index.internalPointer());
if (role == Qt::DisplayRole && index.column() == 0)
return node->name;
return {};
}
QModelIndex CustomTreeModel::index(int row, int column, const QModelIndex &parent) const {
if (!hasIndex(row, column, parent))
return {};
Node* parentNode = parent.isValid()
? static_cast<Node*>(parent.internalPointer())
: root;
if (row >= parentNode->childrenNodes.size())
return {};
Node* childNode = parentNode->childrenNodes[row];
return createIndex(row, column, childNode);
}
QModelIndex CustomTreeModel::parent(const QModelIndex &child) const {
if (!child.isValid())
return {};
Node* childNode = static_cast<Node*>(child.internalPointer());
if (childNode == root || !childNode->childrenNodes.isEmpty())
return {};
for (auto parentNode : root->childrenNodes) {
if (parentNode->childrenNodes.contains(childNode)) {
return createIndex(root->childrenNodes.indexOf(parentNode), 0, parentNode);
}
}
return {};
}
int CustomTreeModel::rowCount(const QModelIndex &parent) const {
if (parent.column() > 0)
return 0;
Node* parentNode = parent.isValid()
? static_cast<Node*>(parent.internalPointer())
: root;
return parentNode->childrenNodes.size();
}
int CustomTreeModel::columnCount(const QModelIndex &) const {
return 1;
}
/// MainWindow Implementation
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
private slots:
void loadDatabaseData();
private:
QSqlDatabase db;
QTreeView *treeView;
CustomTreeModel *model;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), treeView(new QTreeView(this)), model(new CustomTreeModel(this)) {
setCentralWidget(treeView);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(treeView);
this->setLayout(layout);
treeView->setModel(model);
connect(this, SIGNAL(loadDatabaseSignal()), SLOT(loadDatabaseData()));
emit loadDatabaseSignal();
}
void MainWindow::loadDatabaseData() {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qWarning() << "Failed to open database:" << db.lastError().text();
return;
}
QSqlQuery query(db);
query.exec("CREATE TABLE testTable(id INTEGER PRIMARY KEY, col1 TEXT, col2 TEXT, col3 TEXT)");
query.exec("INSERT INTO testTable(col1, col2, col3) VALUES('A', 'B', 'C')");
query.exec("INSERT INTO testTable(col1, col2, col3) VALUES('D', 'E', 'F')");
while (query.next()) {
QString col1 = query.value(1).toString();
QString col2 = query.value(2).toString();
QString col3 = query.value(3).toString();
Node* parentNode = new Node{col1, {col2, col3}, {}};
model->root->childrenNodes.append(parentNode);
}
}
```
---
### 功能描述
1. **数据库连接与查询**: 使用 SQLite 数据库存储模拟数据[^1]。
2. **自定义模型**: 创建了一个继承自 `QAbstractItemModel` 的自定义模型 `CustomTreeModel` 来管理树形结构[^2]。
3. **树视图绑定**: 将自定义模型设置给 `QTreeView` 控件[^3]。
4. **动态加载数据**: 当主窗体启动时自动从数据库加载数据并填充到树形控件中[^4]。
---
###
阅读全文
相关推荐

















