QFile 類
構造函數
QFile() 無參構造
? ? 僅僅構建一個QFile 對象,不設定文件名
QFile(文件名)
? ? 構建一個QFile對象的同時,設定文件名
? ? 但是注意,僅僅設定文件名,并不會打開該文件
設定文件名
QFile file
file.setFileName(文件名)
并不會打開
打開文件
file.open(打開模式)
文件寫
qint64 write(const char *data, qint64 maxSize)
? ? file.write(數據,數據長度)//將data,最多maxSize個字節,寫入file代表的文件中?
qint64 write(const char *data)
? ? file.write(數據)//將data,到結束符為止,寫入file代表的文件中?
?qint64 write(const QByteArray &byteArray)
? ? QByteArray本質是c語言的字符數組,做一段內存來管理
我們的數據一般是一個 QString 對象
? ? so要將一個 QString 對象轉換成 QByteArray 對象:
? ??
? ??QString? str = "hello"//QString,有toLocal8Bit() :將QString轉換成 QByteArray
? ? QByteArray? ?qarr = str.toLocal8Bit();
class Widget : public QWidget
{
public:Widget(QWidget *parent = nullptr);~Widget();void save_data(const QString &filename,const QString &data);private:Ui::Widget *ui;QFile file;
};Widget::~Widget()
{QString name=ui->lineEdit->text();save_data("D:/name.text",name);delete ui;
}void Widget::save_data(const QString &filename, const QString &data)
{file.setFileName(filename);file.open(QFile::WriteOnly);file.write(data.toLocal8Bit());file.close();
}
文件讀?
qint64 read(char *data, qint64 maxSize)
? ? char buf[64] = {0}
? ? file.read(buf,64)//從file文件中讀取最多64個字節的數據,并且將讀取到的數據寫入buf中
? ? 返回讀取到的數據的字節數
QByteArray read(qint64 maxSize)
? ? QByteArray? ?qarr = file.read(64)//?從file文件中,讀取最多64個字節的數據,并且將讀取到的數據,構建成一個QByteArray對象后返回
將? QByteArray 數據,轉換成 QString 數據
? ? ? ? 1:在QByteArray 尋找,返回值是 QString,函數名是toXXXX,形參沒有的函數
? ? ? ? 2:在QString的構造函數,尋找參數為 QByteArray 的構造函數
? ? ? ? ? ? 不支持中文
? ? ? ? 3:在QString的靜態方法,尋找返回值為 QString,參數是 QByteArray的函數
? ? ? ? ? ?找到?fromLocal8Bit(),支持中文
QByteArray? ? readAll()
? ? QByteArray arr = file.readAll()//?讀取文件中的全部數據
//將讀取到的數據,構建成 QByteArray 后返回
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QString name=load_data("D:name.text");ui->lineEdit->setText(name);
}QString Widget::load_data(const QString &filename)
{file.setFileName(filename);file.open(QFile::ReadOnly);QByteArray barr=file.readAll();QString str=QString::fromLocal8Bit(barr);file.close();return str;
}
作業
1:在注冊登錄的練習里面,追加一個QListWidget 項目列表
要求:點擊注冊之后,將賬號顯示到 listWidget上面去
以及,在listWidget中雙擊某個賬號的時候,將該賬號刪除?
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QFile>
#include <QListWidgetItem>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void save_data(const QString &filename, const QString &data);QString load_data(const QString &filename);private slots:void on_lineEdit_textChanged(const QString &arg1);void on_lineEdit_2_textChanged(const QString &arg1);void on_pushButton_3_pressed();void on_pushButton_3_released();void on_checkBox_stateChanged(int arg1);void on_pushButton_clicked(); // 注冊按鈕點擊事件void on_listWidget_doubleClicked(const QModelIndex &index); // 雙擊刪除賬號
private:Ui::Widget *ui;QFile file;
};#endif // WIDGET_H#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 加載用戶名QString name = load_data("D:/name.text");ui->lineEdit->setText(name);// 加載復選框狀態QString ischeck = load_data("D:/ischecked.text");if (ischeck == "1") ui->checkBox->setChecked(true);// 如果復選框被選中,加載密碼if (ui->checkBox->isChecked()) {QString pswd = load_data("D:/pswd.text");ui->lineEdit_2->setText(pswd);}// 初始化按鈕狀態QString nameText = ui->lineEdit->text();QString pswdText = ui->lineEdit_2->text();if (nameText.isEmpty() || pswdText.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);}
}Widget::~Widget()
{// 保存用戶名和密碼QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();save_data("D:/name.text", name);save_data("D:/pswd.text", pswd);delete ui;
}void Widget::save_data(const QString &filename, const QString &data)
{file.setFileName(filename);if (!file.open(QFile::WriteOnly)) {QMessageBox::warning(this, "Error", "Failed to save file: " + filename);return;}file.write(data.toLocal8Bit());file.close();
}QString Widget::load_data(const QString &filename)
{file.setFileName(filename);if (!file.open(QFile::ReadOnly)) {return QString(); // 文件不存在時返回空字符串}QByteArray barr = file.readAll();QString str = QString::fromLocal8Bit(barr);file.close();return str;
}void Widget::on_lineEdit_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if (name.isEmpty() || pswd.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);} else {ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(true);}
}void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if (name.isEmpty() || pswd.isEmpty()) {ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);} else {ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(true);}
}void Widget::on_pushButton_3_pressed()
{ui->lineEdit_2->setEchoMode(QLineEdit::Normal);
}void Widget::on_pushButton_3_released()
{ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}void Widget::on_checkBox_stateChanged(int arg1)
{save_data("D:/ischecked.text", arg1 == Qt::Checked ? "1" : "0");
}void Widget::on_pushButton_clicked()//注冊
{// 獲取用戶名QString name = ui->lineEdit->text();// 將用戶名添加到 QListWidgetif (!name.isEmpty()) {ui->listWidget->addItem(name);QMessageBox::information(this, "注冊成功", "賬號已添加到列表!");} else {QMessageBox::warning(this, "注冊失敗", "用戶名不能為空!");}
}void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{// 獲取選中的項QListWidgetItem *item = ui->listWidget->item(index.row());if (item) {// 刪除選中的項delete item;QMessageBox::information(this, "刪除成功", "賬號已從列表中刪除!");}
}#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}