一、文本文件读写
文件打开方式
QIODevice::ReadOnly 以只读方式打开
QIODevice::QriteOnly 以只写方式打开
QIODevice::ReadWrite 以读写方式打开
QIODevice::Append 新增加的内容将被追加到文件末尾
QIODevice::Truncate 以重写的方式打开,原有内容会被删除
QIODevice::Text 在读取时,行结束符转换为\n;在写时,将行结束符转换为本地格式,例如:Win32平台是\r\n
1、实现工具
(1)创建项目,基于QMainWindow
(2)添加图标资源文件与组件
(3)实现功能
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->tabWidget);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actOpenIODevice_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString dlgTitle = "打开文件";
QString filter = "程序(*.c *.cpp);;文本(*.txt);;所有文件(*.*)";
QString strFileName = QFileDialog::getOpenFileName(this,
dlgTitle, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
ui->plainTextEditIODevice->setPlainText(
QString::fromLocal8Bit(file.readAll()));
file.close();
ui->tabWidget->setCurrentIndex(0);
}
}
void MainWindow::on_actSaveIODevice_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString dlgTitle = "保存文件";
QString filter = "程序(*.c *.cpp);;文本(*.txt);;所有文件(*.*)";
QString strFileName = QFileDialog::getSaveFileName(this,
dlgTitle, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QString str = ui->plainTextEditIODevice->toPlainText();
QByteArray btArray = str.toUtf8();
file.write(btArray, btArray.size());
file.close();
ui->tabWidget->setCurrentIndex(0);
}
}
void MainWindow::on_actOpenStream_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString dlgTitle = "打开文件";
QString filter = "程序(*.c *.cpp);;文本(*.txt);;所有文件(*.*)";
QString strFileName = QFileDialog::getOpenFileName(this,
dlgTitle, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream stream(&file);
while (!stream.atEnd())
{
ui->plainTextEditTextStream->appendPlainText(stream.readLine());
}
// ui->plainTextEditTextStream->setPlainText(stream.readAll());
file.close();
ui->tabWidget->setCurrentIndex(1);
}
}
void MainWindow::on_actSaveQTextStream_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString dlgTitle = "保存文件";
QString filter = "程序(*.c *.cpp);;文本(*.txt);;所有文件(*.*)";
QString strFileName = QFileDialog::getSaveFileName(this,
dlgTitle, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream stream(&file);
QString str = ui->plainTextEditTextStream->toPlainText();
stream << str;
file.close();
ui->tabWidget->setCurrentIndex(1);
}
}
二、二进制文件读写
使用QFile和QDataStream进行二进制数据的读写
QFile 负责文件的IO设备接口,即与文件物理交互
QDataStream 以数据六的方式读取文件内容或写入文件内容。
1、实现工具
(1)创建项目,基于QMainWIndow
(2)添加图标资源文件,添加组件
(3)实现功能
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->tableView);
theModel = new QStandardItemModel(this);
theSelect = new QItemSelectionModel(theModel);
ui->tableView->setModel(theModel);
QStringList headerList;
headerList << "Depth";
headerList << "Measured Depth";
headerList << "Direction";
headerList << "Offset";
headerList << "Quality";
headerList << "Sampled";
theModel->setHorizontalHeaderLabels(headerList);
resetTable(5);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::resetTable(int row)
{
theModel->removeRows(0, theModel->rowCount());
theModel->setRowCount(row);
QString str = theModel->headerData(theModel->columnCount() - 1, Qt::Horizontal,
Qt::DisplayRole).toString();
for (int i = 0; i < row; ++i)
{
// ui->tableView->setItemDelegateForColumn(0, &intSpinDelegate);
// ui->tableView->setItemDelegateForColumn(1, &floatSpinDelegate);
// ui->tableView->setItemDelegateForColumn(2, &floatSpinDelegate);
// ui->tableView->setItemDelegateForColumn(3, &floatSpinDelegate);
// ui->tableView->setItemDelegateForColumn(5, &checkboxDelegate);
QModelIndex index = theModel->index(i, theModel->columnCount() - 1);
QStandardItem *item = theModel->itemFromIndex(index);
item->setData(str, Qt::DisplayRole);
item->setCheckable(true);
item->setEditable(false);
}
}
void MainWindow::on_actTabeset_triggered()
{
resetTable(10);
}
void MainWindow::on_actOpen_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString title = "打开文件";
QString filter = "Qt预定义编码(*.stm)";
QString strFileName = QFileDialog::getOpenFileName(this, title, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::ReadOnly))
{
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_13);
qint16 rowCount, colCount;
stream >> rowCount;
stream >> colCount;
resetTable(rowCount);
/*
headerList << "Depth";
headerList << "Measured Depth";
headerList << "Direction";
headerList << "Offset";
headerList << "Quality";
headerList << "Sampled";
*/
QString str;
for (int i = 0; i < colCount; ++i)
{
stream >> str;
}
qint16 Depth;
qreal MeasuredDepth, Direction, offset;
QString Quality;
bool sampled;
QModelIndex index;
QStandardItem *item;
for (int i = 0; i < rowCount; ++i)
{
stream >> Depth;
index = theModel->index(i, 0);
item = theModel->itemFromIndex(index);
item->setData(Depth, Qt::DisplayRole);
stream >> MeasuredDepth;
index = theModel->index(i, 1);
item = theModel->itemFromIndex(index);
item->setData(MeasuredDepth, Qt::DisplayRole);
stream >> Direction;
index = theModel->index(i, 2);
item = theModel->itemFromIndex(index);
item->setData(Direction, Qt::DisplayRole);
stream >> offset;
index = theModel->index(i, 3);
item = theModel->itemFromIndex(index);
item->setData(offset, Qt::DisplayRole);
stream >> Quality;
index = theModel->index(i, 4);
item = theModel->itemFromIndex(index);
item->setData(Quality, Qt::DisplayRole);
stream >> sampled;
index = theModel->index(i, 5);
item = theModel->itemFromIndex(index);
if(sampled)
{
item->setCheckState(Qt::Checked);
}
else
{
item->setCheckState(Qt::Unchecked);
}
}
file.close();
}
}
void MainWindow::on_actSave_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString title = "保存文件";
QString filter = "标准编码(*.dat)";
QString strFileName = QFileDialog::getSaveFileName(this, title, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_13);
qint16 rowCount, colCount;
rowCount = theModel->rowCount();
colCount = theModel->columnCount();
stream << rowCount;
stream << colCount;
/*
headerList << "Depth";
headerList << "Measured Depth";
headerList << "Direction";
headerList << "Offset";
headerList << "Quality";
headerList << "Sampled";
*/
for (int i = 0; i < colCount; ++i)
{
stream << theModel->horizontalHeaderItem(i)->text();
}
qint16 Depth;
qreal MeasuredDepth, Direction, offset;
QString Quality;
bool sampled;
for (int i = 0; i < rowCount; ++i)
{
auto data = theModel->item(i, 0)->data(Qt::DisplayRole);
Depth = theModel->item(i, 0)->data(Qt::DisplayRole).toInt();
stream << Depth;
MeasuredDepth = theModel->item(i, 1)->data(Qt::DisplayRole).toFloat();
stream << MeasuredDepth;
Direction = theModel->item(i, 2)->data(Qt::DisplayRole).toFloat();
stream << Direction;
offset = theModel->item(i, 3)->data(Qt::DisplayRole).toFloat();
stream << offset;
Quality = theModel->item(i, 4)->data(Qt::DisplayRole).toString();
stream << Quality;
if(theModel->item(i, 5)->checkState() == Qt::Checked)
{
sampled = true;
}
else
{
sampled = false;
}
stream << sampled;
}
file.close();
}
}
void MainWindow::on_actOpenBin_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString title = "打开文件";
QString filter = "标准编码(*.dat)";
QString strFileName = QFileDialog::getOpenFileName(this, title, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::ReadOnly))
{
QDataStream stream(&file);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_13);
qint16 rowCount, colCount;
// stream >> rowCount;
// stream >> colCount;
stream.readRawData((char*)&rowCount, sizeof(qint16));
stream.readRawData((char*)&colCount, sizeof(qint16));
/*
headerList << "Depth";
headerList << "Measured Depth";
headerList << "Direction";
headerList << "Offset";
headerList << "Quality";
headerList << "Sampled";
*/
char* buf;
uint strLen;
for (int i = 0; i < colCount; ++i)
{
// stream >> str;
stream.readBytes(buf, strLen);
}
qint16 Depth;
qreal MeasuredDepth, Direction, offset;
QString Quality;
qint8 sampled;
QModelIndex index;
QStandardItem *item;
for (int i = 0; i < rowCount; ++i)
{
// stream >> Depth;
stream.readRawData((char*)&Depth, sizeof(qint16));
index = theModel->index(i, 0);
item = theModel->itemFromIndex(index);
item->setData(Depth, Qt::DisplayRole);
// stream >> MeasuredDepth;
stream.readRawData((char*)&MeasuredDepth, sizeof(qreal));
index = theModel->index(i, 1);
item = theModel->itemFromIndex(index);
item->setData(MeasuredDepth, Qt::DisplayRole);
// stream >> Direction;
stream.readRawData((char*)&Direction, sizeof(qreal));
index = theModel->index(i, 2);
item = theModel->itemFromIndex(index);
item->setData(Direction, Qt::DisplayRole);
// stream >> offset;
stream.readRawData((char*)&offset, sizeof(qreal));
index = theModel->index(i, 3);
item = theModel->itemFromIndex(index);
item->setData(offset, Qt::DisplayRole);
// stream >> Quality;
stream.readBytes(buf, strLen);
Quality = QString::fromLocal8Bit(buf, strLen);
index = theModel->index(i, 4);
item = theModel->itemFromIndex(index);
item->setData(Quality, Qt::DisplayRole);
// stream >> sampled;
stream.readRawData((char*)&sampled, sizeof(qint8));
index = theModel->index(i, 5);
item = theModel->itemFromIndex(index);
if(sampled)
{
item->setCheckState(Qt::Checked);
}
else
{
item->setCheckState(Qt::Unchecked);
}
}
file.close();
}
}
void MainWindow::on_actSaveBin_triggered()
{
QString curPath = QCoreApplication::applicationDirPath();
QString title = "保存文件";
QString filter = "标准编码(*.dat)";
QString strFileName = QFileDialog::getSaveFileName(this, title, curPath, filter);
if(strFileName.isEmpty())
{
return;
}
QFile file(strFileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
QDataStream stream(&file);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setVersion(QDataStream::Qt_5_13);
qint16 rowCount, colCount;
rowCount = theModel->rowCount();
colCount = theModel->columnCount();
// stream << rowCount;
// stream << colCount;
stream.writeRawData((char*)&rowCount, sizeof(qint16));
stream.writeRawData((char*)&colCount, sizeof(qint16));
/*
headerList << "Depth";
headerList << "Measured Depth";
headerList << "Direction";
headerList << "Offset";
headerList << "Quality";
headerList << "Sampled";
*/
QByteArray btArray;
for (int i = 0; i < colCount; ++i)
{
// stream << theModel->horizontalHeaderItem(i)->text();
btArray = theModel->horizontalHeaderItem(i)->text().toUtf8();
stream.writeBytes(btArray, btArray.length());
}
qint16 Depth;
qreal MeasuredDepth, Direction, offset;
QString Quality;
int8_t sampled;
for (int i = 0; i < rowCount; ++i)
{
auto data = theModel->item(i, 0)->data(Qt::DisplayRole);
Depth = theModel->item(i, 0)->data(Qt::DisplayRole).toInt();
// stream << Depth;
stream.writeRawData((char*)&Depth, sizeof(qint16));
MeasuredDepth = theModel->item(i, 1)->data(Qt::DisplayRole).toFloat();
// stream << MeasuredDepth;
stream.writeRawData((char*)&MeasuredDepth, sizeof(qreal));
Direction = theModel->item(i, 2)->data(Qt::DisplayRole).toFloat();
// stream << Direction;
stream.writeRawData((char*)&Direction, sizeof(qreal));
offset = theModel->item(i, 3)->data(Qt::DisplayRole).toFloat();
// stream << offset;
stream.writeRawData((char*)&offset, sizeof(qreal));
Quality = theModel->item(i, 4)->data(Qt::DisplayRole).toString();
// stream << Quality;
btArray = Quality.toUtf8();
stream.writeBytes(btArray, btArray.length());
if(theModel->item(i, 5)->checkState() == Qt::Checked)
{
sampled = 1;
}
else
{
sampled = 0;
}
// stream << sampled;
stream.writeRawData((char*)&sampled, sizeof(int8_t));
}
file.close();
}
}
三、文件目录操作
文件目录操作相关类:
- QCoreApplocation:用于提取应用程序路径、程序名等文件信息
- QFIle:除了打开文件操作外,还有复制文件、删除文件等功能
- QFileInfo:用于提取文件信息,包括路径、文件名、后缀
- QDir:用于提取目录或文件,文件重名等操作
- QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件
- QFileSystemWatcher:监听目录下为念的添加和删除等变化
1、实现工具
(1)创建项目,基于QMainWindow
(2)添加组件
(3)实现功能
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::getBtnInfo(QObject *btn)
{
QPushButton* button = static_cast<QPushButton*>(btn);
ui->plainTextEdit->appendPlainText(button->text());
ui->plainTextEdit->appendPlainText(button->toolTip());
}
void MainWindow::on_btnOpenFile_clicked()
{
QString strCurPath = QDir::currentPath();
QString strFileName = QFileDialog::getOpenFileName(this, "", strCurPath, "(*.*)");
ui->lineEditFile->setText(strFileName);
}
void MainWindow::on_btnOpenDir_clicked()
{
QString strCurPath = QDir::currentPath();
QString strDirName = QFileDialog::getExistingDirectory(this, "", strCurPath);
ui->lineEditDir->setText(strDirName);
}
void MainWindow::on_btnClear_clicked()
{
ui->plainTextEdit->clear();
}
void MainWindow::on_btnApplicationDirPath_clicked()
{
// QPushButton* btn = static_cast<QPushButton*>(sender());
// ui->plainTextEdit->appendPlainText(btn->text());
// ui->plainTextEdit->appendPlainText(btn->toolTip());
getBtnInfo(sender());
ui->plainTextEdit->appendPlainText(QCoreApplication::applicationDirPath());
}
void MainWindow::on_btnStaticCopy_clicked()
{
getBtnInfo(sender());
QString strSource = ui->lineEditFile->text();
QFileInfo info(strSource);
QString strDest = info.path() + "/" + info.fileName() + "-副本." + info.suffix();
QFile::copy(strSource, strDest);
ui->plainTextEdit->appendPlainText("源文件: " + strSource);
ui->plainTextEdit->appendPlainText("副本: " + strDest + "\n");
}
void MainWindow::on_btnMkdir_clicked()
{
getBtnInfo(sender());
QDir dir(ui->lineEditDir->text());
if(dir.mkdir("newDir"))
{
ui->plainTextEdit->appendPlainText("创建成功");
}
else
{
ui->plainTextEdit->appendPlainText("创建失败");
}
}
void MainWindow::on_btnAddPath_clicked()
{
getBtnInfo(sender());
ui->plainTextEdit->appendPlainText("监听目录:" + ui->lineEditDir->text());
fileWatcher.addPath(ui->lineEditDir->text());
fileWatcher.addPath(ui->lineEditFile->text());
QObject::connect(&fileWatcher, &QFileSystemWatcher::directoryChanged,
this, MainWindow::on_dirctoryChanged);
QObject::connect(&fileWatcher, &QFileSystemWatcher::fileChanged,
this, MainWindow::on_fileChanged);
}
void MainWindow::on_fileChanged()
{
ui->plainTextEdit->appendPlainText("监听到文件");
}
void MainWindow::on_dirctoryChanged()
{
ui->plainTextEdit->appendPlainText("监听到目录");
}
void MainWindow::on_btnRemovePath_clicked()
{
getBtnInfo(sender());
ui->plainTextEdit->appendPlainText("监听目录:" + ui->lineEditDir->text());
fileWatcher.removePath(ui->lineEditDir->text());
fileWatcher.removePath(ui->lineEditFile->text());
QObject::disconnect(&fileWatcher, &QFileSystemWatcher::directoryChanged,
this, MainWindow::on_dirctoryChanged);
QObject::disconnect(&fileWatcher, &QFileSystemWatcher::fileChanged,
this, MainWindow::on_fileChanged);
}