欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)

 更新時(shí)間:2022年06月15日 16:02:48   作者:wendy_ya  
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)打開最近文檔功能,并實(shí)現(xiàn)基本的新建、打開、保存、退出、幫助等功能,感興趣的可以動(dòng)手嘗試一下

一、項(xiàng)目介紹

本文介紹利用Qt實(shí)現(xiàn)打開最近文檔功能,并實(shí)現(xiàn)基本的新建、打開、保存、退出、幫助等功能。

二、項(xiàng)目基本配置

新建一個(gè)Qt案例,項(xiàng)目名稱為“RecentTest”,基類選擇“QMainWindow”,取消選中創(chuàng)建UI界面復(fù)選框,完成項(xiàng)目創(chuàng)建。

三、UI界面設(shè)置

無UI界面

四、主程序?qū)崿F(xiàn)

4.1 mainwindow.h頭文件

頭文件中需要聲明若干槽函數(shù)和相應(yīng)函數(shù):

private slots:
    void newFile();
    void open();
    void save();
    void saveAs();
    void openRecentFile();
    void about();

private:
    void createActions();
    void createMenus();
    void loadFile(const QString &fileName);
    void saveFile(const QString &fileName);
    void setCurrentFile(const QString &fileName);
    void updateRecentFileActions();
    QString strippedName(const QString &fullFileName);

    QString curFile;

    QTextEdit *textEdit;
    QMenu *fileMenu;
    QMenu *recentFilesMenu;
    QMenu *helpMenu;
    QAction *newAct;
    QAction *openAct;
    QAction *saveAct;
    QAction *saveAsAct;
    QAction *exitAct;
    QAction *aboutAct;
    QAction *aboutQtAct;
    QAction *separatorAct;
	//設(shè)置最大最近文件為5個(gè)
    enum { MaxRecentFiles = 5 };
    QAction *recentFileActs[MaxRecentFiles];

4.2 mainwindow.cpp源文件

需要在構(gòu)造函數(shù)中添加如下代碼:

    setAttribute(Qt::WA_DeleteOnClose);//當(dāng)關(guān)閉時(shí)刪除該組件

    textEdit = new QTextEdit;//新建TextEdit
    setCentralWidget(textEdit);//設(shè)為中心部件

    createActions();
    createMenus();
    (void)statusBar();//增加狀態(tài)欄

    setWindowFilePath(QString());
    resize(400, 300);//調(diào)整尺寸大小

構(gòu)造函數(shù)中的createActions()函數(shù)用于創(chuàng)建相應(yīng)的行為,創(chuàng)建了New、Open、Save、Save As、最近5個(gè)文件、Exit、About和About Qt這幾個(gè)Action,并設(shè)置相應(yīng)的快捷鍵、狀態(tài)欄和連接槽函數(shù):

//創(chuàng)建action
void MainWindow::createActions()
{
    newAct = new QAction(tr("&New"), this);//new
    newAct->setShortcuts(QKeySequence::New);//設(shè)置快捷鍵
    newAct->setStatusTip(tr("Create a new file"));//設(shè)置狀態(tài)欄
    connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

    openAct = new QAction(tr("&Open..."), this);//open
    openAct->setShortcuts(QKeySequence::Open);//設(shè)置快捷鍵
    openAct->setStatusTip(tr("Open an existing file"));//設(shè)置狀態(tài)欄
    connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

    saveAct = new QAction(tr("&Save"), this);//save
    saveAct->setShortcuts(QKeySequence::Save);//設(shè)置快捷鍵
    saveAct->setStatusTip(tr("Save the document to disk"));//設(shè)置狀態(tài)欄
    connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

    saveAsAct = new QAction(tr("Save &As..."), this);//save as
    saveAsAct->setShortcuts(QKeySequence::SaveAs);//設(shè)置快捷鍵
    saveAsAct->setStatusTip(tr("Save the document under a new name"));//設(shè)置狀態(tài)欄
    connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));

    //5個(gè)Action(打開最近五個(gè)文件)
    for (int i = 0; i < MaxRecentFiles; ++i) {
        recentFileActs[i] = new QAction(this);
        recentFileActs[i]->setVisible(false);
        connect(recentFileActs[i], SIGNAL(triggered()),
                this, SLOT(openRecentFile()));
    }

    exitAct = new QAction(tr("E&xit"), this);//exit
    exitAct->setShortcuts(QKeySequence::Quit);//設(shè)置快捷鍵
    exitAct->setStatusTip(tr("Exit the application"));//設(shè)置狀態(tài)欄
    connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));

    aboutAct = new QAction(tr("&About"), this);//about
    aboutAct->setStatusTip(tr("Show the application's About box"));//設(shè)置狀態(tài)欄
    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

    aboutQtAct = new QAction(tr("About &Qt"), this);//About &Qt
    aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));//設(shè)置狀態(tài)欄
    connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}

newFile()槽函數(shù)用于新建一個(gè)相同的窗口:

//新建界面并顯示
void MainWindow::newFile()
{
    MainWindow *other = new MainWindow;
    other->show();
}

open()槽函數(shù)用于打開并加載文檔:

//打開文件
void MainWindow::open()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    if (!fileName.isEmpty())
        loadFile(fileName);
}

loadFile()函數(shù):

//加載文件
void MainWindow::loadFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("Recent Files"),
                             tr("Cannot read file %1:\n%2.")
                             .arg(fileName)
                             .arg(file.errorString()));
        return;
    }

    QTextStream in(&file);

    QGuiApplication::setOverrideCursor(Qt::WaitCursor);//等待光標(biāo)
    textEdit->setPlainText(in.readAll());//設(shè)置文本
    QGuiApplication::restoreOverrideCursor();//撤銷最后一個(gè)光標(biāo)

    setCurrentFile(fileName);
    statusBar()->showMessage(tr("File loaded"), 2000);
}

setCurrentFile()函數(shù)用于設(shè)置當(dāng)前文件關(guān)聯(lián)路徑:

//設(shè)置當(dāng)前文件
void MainWindow::setCurrentFile(const QString &fileName)
{
    curFile = fileName;
    setWindowFilePath(curFile);//設(shè)置關(guān)聯(lián)文件路徑

    QSettings settings;
    QStringList files = settings.value("recentFileList").toStringList();
    files.removeAll(fileName);//移除所有文件名
    files.prepend(fileName);//在開頭附加子串
    //如果尺寸超過最大尺寸,則刪除最后一項(xiàng)
    while (files.size() > MaxRecentFiles)
        files.removeLast();

    settings.setValue("recentFileList", files);//設(shè)置鍵值對(duì)

    foreach (QWidget *widget, QApplication::topLevelWidgets()) {
        MainWindow *mainWin = qobject_cast<MainWindow *>(widget);
        if (mainWin)
            mainWin->updateRecentFileActions();//更新最近文件
    }
}

updateRecentFileActions()函數(shù)更新最近文件信息

void MainWindow::updateRecentFileActions()
{
    QSettings settings;
    QStringList files = settings.value("recentFileList").toStringList();//讀取recentFileList的值

    int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);//計(jì)算兩者的最小值

    for (int i = 0; i < numRecentFiles; ++i) {
        QString text = tr("&%1 %2").arg(i + 1).arg(strippedName(files[i]));//序號(hào) 文件名
        recentFileActs[i]->setText(text);//設(shè)置文本
        recentFileActs[i]->setData(files[i]);//設(shè)置數(shù)據(jù)
        recentFileActs[i]->setVisible(true);//設(shè)置可見性
    }
    for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
        recentFileActs[j]->setVisible(false);//其他數(shù)量設(shè)置為不可見

    separatorAct->setVisible(numRecentFiles > 0);//如果有最近未見則設(shè)置分隔符為可見
}

strippedName()函數(shù)用于獲取相應(yīng)的文件名:

//獲取文件名
QString MainWindow::strippedName(const QString &fullFileName)
{
    return QFileInfo(fullFileName).fileName();//返回文件名
}

save()函數(shù)和saveAs()槽函數(shù)用于將文檔進(jìn)行保存:

//保存文件
void MainWindow::save()
{
    if (curFile.isEmpty())
        saveAs();//如果curFile為空,則設(shè)置保存為
    else
        saveFile(curFile);
}
//保存為
void MainWindow::saveAs()
{
    QString fileName = QFileDialog::getSaveFileName(this);
    if (fileName.isEmpty())
        return;

    saveFile(fileName);
}

saveFile()函數(shù):

void MainWindow::saveFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("Recent Files"),
                             tr("Cannot write file %1:\n%2.")
                             .arg(fileName)
                             .arg(file.errorString()));
        return;
    }

    QTextStream out(&file);
    QGuiApplication::setOverrideCursor(Qt::WaitCursor);//等待光標(biāo)
    out << textEdit->toPlainText();//將文本寫入
    QGuiApplication::restoreOverrideCursor();//撤銷最后一個(gè)光標(biāo)

    setCurrentFile(fileName);
    statusBar()->showMessage(tr("File saved"), 2000);//狀態(tài)欄顯示2000ms
}

openRecentFile()槽函數(shù)用于打開最近的文件:

//打開最近文件
void MainWindow::openRecentFile()
{
    QAction *action = qobject_cast<QAction *>(sender());
    if (action)
        loadFile(action->data().toString());
}

about()槽函數(shù)顯示相關(guān)信息:

//about
void MainWindow::about()
{
   QMessageBox::about(this, tr("About Recent Files"),
            tr("The <b>Recent Files</b> example demonstrates how to provide a "
               "recently used file menu in a Qt application."));
}

構(gòu)造函數(shù)中的createMenus()函數(shù)用于創(chuàng)建相應(yīng)的菜單欄:

void MainWindow::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAct);
    fileMenu->addAction(openAct);
    fileMenu->addAction(saveAct);
    fileMenu->addAction(saveAsAct);
    separatorAct = fileMenu->addSeparator();//增加分隔符
    for (int i = 0; i < MaxRecentFiles; ++i)
        fileMenu->addAction(recentFileActs[i]);
    fileMenu->addSeparator();               //增加分隔符
    fileMenu->addAction(exitAct);
    updateRecentFileActions();

    menuBar()->addSeparator();

    helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);
}

4.3 main.cpp

main.cpp中代碼如下:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setOrganizationName("Recently");         //設(shè)置組織名稱
    a.setApplicationName("Recent Files");       //設(shè)置標(biāo)題名稱

    MainWindow w;
    w.show();
    return a.exec();
}

【注意】

在mainwindow.cpp中QSettings settings;語句用于構(gòu)造QSettings對(duì)象。

代碼:

QCoreApplication::setOrganizationName("Recently");         //設(shè)置組織名稱
QCoreApplication::setApplicationName("Recent Files");       //設(shè)置標(biāo)題名稱
QSettings settings;

等價(jià)于

QSettings settings("Recently", "Recent Files");

如果之前未調(diào)用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName(),則QSettings對(duì)象將無法讀取或?qū)懭肴魏卧O(shè)置,status()將返回AccessError。

五、效果演示

完整效果如下:

以上就是QT實(shí)戰(zhàn)之打開最近文檔功能的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于QT打開文檔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論