qt多线程读文件,并把文件内容放到tableview里面进行分页.h 和.cpp
时间: 2024-03-13 22:46:29 浏览: 25
以下是一个简单的示例,演示如何使用Qt多线程读取文件,然后将文件内容分页并显示在TableView中。
首先,我们需要创建一个线程类来处理文件读取和分页操作。在这个示例中,我们将使用QThread类作为基类,然后覆盖run()函数来执行线程操作。我们还将添加一个信号(sendData)来将读取的数据发送回主线程。
FileReaderThread.h文件:
```cpp
#ifndef FILEREADERTHREAD_H
#define FILEREADERTHREAD_H
#include <QThread>
#include <QStringList>
class FileReaderThread : public QThread
{
Q_OBJECT
public:
explicit FileReaderThread(QObject *parent = nullptr);
void setFileName(const QString &fileName);
void setPageSize(int pageSize);
signals:
void sendData(const QStringList &data);
protected:
void run() override;
private:
QString m_fileName;
int m_pageSize;
};
#endif // FILEREADERTHREAD_H
```
FileReaderThread.cpp文件:
```cpp
#include "FileReaderThread.h"
#include <QFile>
#include <QTextStream>
FileReaderThread::FileReaderThread(QObject *parent)
: QThread(parent)
, m_pageSize(10)
{
}
void FileReaderThread::setFileName(const QString &fileName)
{
m_fileName = fileName;
}
void FileReaderThread::setPageSize(int pageSize)
{
m_pageSize = pageSize;
}
void FileReaderThread::run()
{
QFile file(m_fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
QStringList dataList;
int lineCount = 0;
while (!in.atEnd()) {
QString line = in.readLine();
if (line.isEmpty())
continue;
dataList.append(line);
++lineCount;
if (lineCount >= m_pageSize) {
emit sendData(dataList);
dataList.clear();
lineCount = 0;
}
}
if (!dataList.isEmpty())
emit sendData(dataList);
}
```
接下来,我们需要在主线程中创建一个TableView,并将其与一个QStandardItemModel关联。然后,我们将创建一个QLineEdit和一个QPushButton,允许用户输入文件名和页大小。当用户单击按钮时,我们将启动一个新线程来处理文件读取和分页操作。
MainWindow.h文件:
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStringList>
namespace Ui {
class MainWindow;
}
class QStandardItemModel;
class FileReaderThread;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void onThreadData(const QStringList &data);
private:
Ui::MainWindow *ui;
QStandardItemModel *m_model;
FileReaderThread *m_thread;
};
#endif // MAINWINDOW_H
```
MainWindow.cpp文件:
```cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "FileReaderThread.h"
#include <QStandardItemModel>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_model(new QStandardItemModel(this)),
m_thread(new FileReaderThread(this))
{
ui->setupUi(this);
m_model->setHorizontalHeaderLabels(QStringList() << "Line");
ui->tableView->setModel(m_model);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
connect(m_thread, &FileReaderThread::sendData, this, &MainWindow::onThreadData);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString fileName = ui->lineEdit->text().trimmed();
if (fileName.isEmpty()) {
QMessageBox::warning(this, tr("Warning"), tr("Please input file name!"));
return;
}
bool ok;
int pageSize = ui->lineEdit_2->text().toInt(&ok);
if (!ok || pageSize < 1) {
QMessageBox::warning(this, tr("Warning"), tr("Please input correct page size!"));
return;
}
m_thread->setFileName(fileName);
m_thread->setPageSize(pageSize);
m_thread->start();
}
void MainWindow::onThreadData(const QStringList &data)
{
for (const auto &line : data) {
QList<QStandardItem *> items;
items.append(new QStandardItem(line));
m_model->appendRow(items);
}
}
```
现在我们已经完成了示例应用程序的所有代码。当用户单击“PushButton”按钮时,我们将启动一个新线程来处理文件读取和分页操作。每当线程读取一页数据时,它将使用sendData信号将数据发送回主线程。主线程将收到数据并将其添加到TableView中。
注意!在实际应用程序中,您需要添加一些错误处理代码来处理可能出现的错误,例如文件打开失败等。