如何使用多线程分别处理数据获取和任务处理,来实现qt 动态创建tableview,获取大量数据,具体实现
时间: 2024-05-03 14:19:32 浏览: 132
tableview 大量数据内存消耗小
以下是一个简单的示例代码,展示了如何使用多线程分别处理数据获取和任务处理,并在主线程中动态创建 TableView。
```cpp
#include <QtWidgets>
#include <QtConcurrent>
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void fetchData()
{
// 模拟获取大量数据
QList<QString> data;
for (int i = 1; i <= 100000; i++)
{
data << QString("Item %1").arg(i);
}
// 将数据传回主线程
emit dataReady(data);
}
signals:
void dataReady(const QList<QString> &data);
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr) : QWidget(parent)
{
// 界面初始化
QVBoxLayout *layout = new QVBoxLayout(this);
QPushButton *btn = new QPushButton("Fetch Data");
tableView = new QTableView(this);
layout->addWidget(btn);
layout->addWidget(tableView);
// 点击按钮开始获取数据
connect(btn, &QPushButton::clicked, this, &Widget::startFetchingData);
// 等待数据的信号
connect(&worker, &Worker::dataReady, this, &Widget::handleDataReady);
// TableView 的模型
model = new QStandardItemModel(this);
model->setColumnCount(1);
}
private:
QTableView *tableView;
QStandardItemModel *model;
QFutureWatcher<void> watcher;
Worker worker;
private slots:
void startFetchingData()
{
// 启动线程获取数据
QFuture<void> future = QtConcurrent::run(&worker, &Worker::fetchData);
watcher.setFuture(future);
// 显示等待对话框
QProgressDialog progress("Fetching Data...", "Cancel", 0, 0, this);
progress.setWindowModality(Qt::WindowModal);
progress.setMinimumDuration(0);
// 等待线程完成或取消
while (!watcher.isFinished())
{
QApplication::processEvents();
if (progress.wasCanceled())
{
watcher.cancel();
break;
}
}
}
void handleDataReady(const QList<QString> &data)
{
// 清空模型
model->removeRows(0, model->rowCount());
// 将数据添加到模型
for (const QString &item : data)
{
QList<QStandardItem*> row;
row << new QStandardItem(item);
model->appendRow(row);
}
// 设置模型到 TableView 上
tableView->setModel(model);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widget widget;
widget.show();
return app.exec();
}
#include "main.moc"
```
在这个示例中,我们创建了一个 `Worker` 类来处理数据获取的工作。这个类中定义了一个 `fetchData` 的槽函数,用于模拟获取大量数据。我们使用 `QtConcurrent::run` 函数在新线程中执行这个槽函数,然后使用 `QFutureWatcher` 来监视这个线程的状态。
在主界面中,我们创建了一个 TableView 和一个按钮,点击按钮会触发获取数据的操作。我们在按钮的槽函数中启动获取数据的线程,并在主线程中显示等待对话框,等待线程完成或取消。当线程完成时,我们将获取到的数据通过信号传回主线程,并在主线程中更新 TableView 的模型。
需要注意的是,在这个示例中我们使用了一个简单的等待对话框来等待线程的完成。这种做法可能会导致界面卡住,不利于用户体验。更好的做法是使用信号和槽机制,将等待对话框和线程完全分离开来。
阅读全文