首頁 > 軟體

基於QT5的檔案讀取程式的實現

2022-05-15 13:00:06

一、檔案讀寫操作QFile

QT自帶了一個檔案操作的類->QFile ,實驗中也是著重 QFile 的操作

1.1 標頭檔案

#include<QFile>

1.2 內部函數

這些函數沒必要都去記住,我們只需要記住簡單的例如open()readLine()atEnd()close() 等常用的函數即可

  • 首先我們new 一個 QFile 物件的時候有四種構造方法,通常來說我們傳入 檔案的路徑名 就好了
  • 然後我們要呼叫open()函數,這個函數是告訴作業系統我們通過什麼樣的方式開啟,例如唯讀開啟、只寫開啟、可讀可寫開啟……,這個和我們在C語言中的檔案開啟函數是類似的,我們在QIODevice看到一個列舉型別的 OpenModeFlag開啟方式
enum OpenModeFlag {
        NotOpen = 0x0000,
        ReadOnly = 0x0001,
        WriteOnly = 0x0002,
        ReadWrite = ReadOnly | WriteOnly,
        Append = 0x0004,
        Truncate = 0x0008,
        Text = 0x0010,
        Unbuffered = 0x0020,
        NewOnly = 0x0040,
        ExistingOnly = 0x0080
    };

這些就是檔案開啟的一些模式了,可以根據自己的需求選用,我們這裡既然是檔案的讀取顯示操作,那麼只需要讀取,於是我們的開啟方式就是:QIODevice::ReadOnly

然後就是對這個檔案從頭到尾讀取,在以前我們學的C語言中有一個檔案結束標誌EOF,一般這個EOF是 − 1 -1 −1 但是這裡的QFile 提供了一個函數atEnd()如果當我們讀到了檔案末尾,那麼就會返回一個true

例如:

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return;

while (!file.atEnd()) {
    QByteArray line = file.readLine();
    process_line(line);
}

最後我們通過file.close()關閉資料流就好了

二、UI設計

這裡隨便畫畫就好了,不過可以在文字顯示框插入背景圖,只需要在元件的styleSheet中新增資源即可

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>300</width>
    <height>500</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="autoFillBackground">
   <bool>false</bool>
  </property>
  <property name="styleSheet">
   <string notr="true"/>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="autoFillBackground">
    <bool>true</bool>
   </property>
   <property name="styleSheet">
    <string notr="true"/>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QWidget" name="widget" native="true">
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QLabel" name="label">
         <property name="text">
          <string>檔案路徑</string>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>開啟檔案</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
    <item>
     <widget class="QGroupBox" name="groupBox">
      <property name="styleSheet">
       <string notr="true"/>
      </property>
      <property name="title">
       <string>文字內容:</string>
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout_2">
       <item>
        <widget class="QTextEdit" name="textEdit">
         <property name="styleSheet">
          <string notr="true">background-image: url(:/a/tmp/back.png);
background-color: rgba(0, 0, 0, 12);</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>300</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

三、程式碼

3.1 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3.2 mainwindow.c

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QDebug>
#include <QPushButton>
#include <QTextStream>
#include <QFileInfo>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //使用connec函數,熟悉匿名錶示式
    connect(ui->pushButton,&QPushButton::clicked,[=](){
       //點選按鈕,彈出檔案選擇對話方塊
       //使用對話方塊,獲取開啟路徑,注意引數一是父類別物件 ,引數二是對話視窗名稱 引數三是預設開啟路徑
       QString fileName = QFileDialog::getOpenFileName(this,
              tr("Open File"), "C:\data");
       //使路徑顯示到路徑 line edit地方
       ui->label->setText(fileName);
       //偵錯的跟蹤列印
       qDebug()<<"檔案路徑為:"+fileName;
       //使用Qfile操作檔案
       QFile file(fileName);
       //開啟檔案,注意引數的使用,檔案修飾符,檔案指標,可以和之前的嵌入式環境程式設計的知識聯絡起來,包括 模式操作
       file.open(QIODevice::ReadOnly);
       //使用陣列資料結構接讀取資料

       QByteArray array;
       while(!file.atEnd())
       {
           array += file.readLine(); //按行讀
       }
       ui->textEdit->setText(array);
       //關閉檔案資料流
       file.close();
       //編碼格式類
       //QTextCodec * codec = QTextCodec::codecForName("gbk");
       QFileInfo info(fileName);
       qDebug() << "大小:" << info.size() << " 字尾名:" << info.suffix() << " 檔名稱:"<<info.fileName() << " 檔案路徑:"<< info.filePath();
       qDebug() << "建立日期:" << info.birthTime().toString("yyyy/MM/dd hh:mm:ss");
       qDebug() << "最後修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
       //獲取檔名,之後,根據這個檔名找到指定檔案,並開啟
   });

}

MainWindow::~MainWindow()
{
    delete ui;
}

四、效果

我們可以看到我們的程式中將我們的日程表開啟了,並且在終端列印了這個檔案的一些資訊,例如:路徑、檔名、大小等等

到此這篇關於基於QT5的檔案讀取程式的實現的文章就介紹到這了,更多相關QT5 檔案讀取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com