欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【学习笔记】C++ GUI Qt4 第三章 3.1 子类化QMainWindow

程序员文章站 2022-05-22 19:53:09
...

第三章 创建主窗口

这一章讲解如何使用Qt创建主窗口。在本章的最后部分,你将能够创建一个应用程序的完整用户界面,包括菜单、工具栏、状态栏以及应用程序所需的足够多的对话框。而在第四章则会实现程序的相关功能。Spreadsheet电子制表软件类似于我们常用的Excel。

首先打开Qt Creator新建一个项目Application->Qt Widgets Application->起名为“q02_Spreadsheet”->类名为“MainWindow”。

3.1 子类化QMainWindow

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QAction;
class QLabel;
class FindDialog;
class Spreadsheet;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{//MainWindow类定义为QMainWindow类的子类。
 //由于类MainWindow提供了自己的信号和槽,所以它包含了Q_OBJECT宏
    Q_OBJECT

public:
    MainWindow();
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);
    //closeEvent()函数是QWidget类中的一个虚函数,当用户关闭窗口时,这个函数会被自动调用。
    //类MainWindow中重新实现了它,这样就可以向用户询问一个标准问题“Do you want to save yourchanges?" ,并且可以把用户的一些偏好设置保存到磁盘中。

private slots:
    void newFile();
    void open();
    bool save();
    bool saveAs();
    void find();
    void goToCell();
    void sort();
    void about();
    /*
     * 像File->New和Help->About这样的菜单项,在MainWindow中会被实现为私有槽。
     * 除了save()槽和saveAs( )槽返回一
     * 个bool值以外,绝大多数的槽都把void作为它们的返回值。
     * 当槽作为一个信号的响应函数而被执行时,就会忽略这个返回值;
     * 但是当把槽作为函数来调用时,其返回值对我们的作用就和调用任何一个普通的C++函数时的作用是相同的。
     */
    void openRecentFile();
    void updateStatusBar();
    void spreadsheetModified();

private:
    Ui::MainWindow *ui;
    void createActions();
    void createMenus();
    void createContextMenu();
    void createToolBars();
    void createStatusBar();
    void readSettings();
    void writeSettings();
    bool okToContinue();
    bool loadFile(const QString &fileName);
    bool saveFile(const QString &fileName);
    void setCurrentFile(const QString &fileName);
    void updateRecentFileActions();
    QString strippedName(const QString &fullFileName);

    Spreadsheet *spreadsheet;
    FindDialog *findDialog;
    QLabel *locationLabel;
    QLabel *formulaLabel;
    QStringList recentFiles;
    QString curFile;

    enum { MaxRecentFiles = 5 };
    QAction *recentFileActions[MaxRecentFiles];
    QAction *separatorAction;

    QMenu *fileMenu;
    QMenu *editMenu;
    QMenu *selectSubMenu;
    QMenu *toolsMenu;
    QMenu *optionsMenu;
    QMenu *helpMenu;
    QToolBar *fileToolBar;
    QToolBar *editToolBar;
    QAction *newAction;
    QAction *openAction;
    QAction *saveAction;
    QAction *saveAsAction;
    QAction *exitAction;
    QAction *cutAction;
    QAction *copyAction;
    QAction *pasteAction;
    QAction *deleteAction;
    QAction *selectRowAction;
    QAction *selectColumnAction;
    QAction *selectAllAction;
    QAction *findAction;
    QAction *goToCellAction;
    QAction *recalculateAction;
    QAction *sortAction;
    QAction *showGridAction;
    QAction *autoRecalcAction;
    QAction *aboutAction;
    QAction *aboutQtAction;
};

#endif // MAINWINDOW_H

//mainwindow.cpp
#include <QtWidgets>//包含了在子类中所要用到的所有Qt类的定义

#include "mainwindow.h"
#include "ui_mainwindow.h"
//后面实现的四个类
#include "finddialog.h"
#include "gotocelldialog.h"
#include "sortdialog.h"
#include "spreadsheet.h"


MainWindow::MainWindow():ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    spreadsheet = new Spreadsheet;
    setCentralWidget(spreadsheet);
    //创建一个Spreadsheet窗口,并设置为*窗口部件,见下图
    //Spreadsheet类是QTableWidget类的一个子类,并且也具有一些电子制表软件的功能

    createActions();
    createMenus();
    createContextMenu();
    createToolBars();
    createStatusBar();
    //创建主窗口中的其余部分

    readSettings();
    //读取这个应用程序存储的一些设置

    findDialog = 0;
    //我们把findDialog指针初始化为空(null)指针。在第一次调用MainWindow::find()函数时,将会创建该FindDialog对象。

    setWindowIcon(QIcon(":/images/icon.png"));
    //把窗口图标设置为icon.png
    //资源机制
    setCurrentFile("");
    //初始化设置当前路径为空
}

【学习笔记】C++ GUI Qt4 第三章 3.1 子类化QMainWindow

图形用户界面(GUI)应用程序通常会使用很多图片。为应用程序提供图片的方法有多种,如
下是一些最常用的方法:
● 把图片保存到文件中,并且在运行时载人它们。
● 把XPM文件包含在源代码中。(这一方法之所以可行,是因为XPM文件也是有效的C++
文件。)
● 使用Qt的资源机制( resource mechanism)。

这里,使用了Qt的资源机制法,因为它比运行时载入文件的方法更方便,并且该方法适用于所支持的任意文件格式。我们将选中的图片存放在源代码树中名为images 的子目录下。(右键.pro文件->在Explorer中显示->创建images文件夹->将图片放至此文件夹下)

为了利用Qt的资源系统(resource system) ,必须创建一个资源文件( resource file) 。

1、右键项目名->Qt中选择Qt Resource File->名称为“spreadsheet.qrc”

2、添加->添加前缀->前缀设置为“/”

3、添加->添加文件->打开images文件夹选中其中的图片

资源文件自身使用了一种简单的XML文件格式。这里给出的是从已经使用的资源文件中的内容。

<RCC>
    <qresource prefix="/">
        <file>images/copy.png</file>
        <file>images/cut.png</file>
        <file>images/find.png</file>
        <file>images/gotocell.png</file>
        <file>images/icon.png</file>
        <file>images/new.png</file>
        <file>images/open.png</file>
        <file>images/paste.png</file>
        <file>images/save.png</file>
    </qresource>
</RCC>

所有资源文件都会被编译到应用程序的可执行文件中,因此并不会弄丢它们。当引用这些资源时,需要使用带路径前缀:/(冒号斜线)的形式,这就是为什么会将图标表示成:/imges/icon. png的形式。资源可以是任意类型的文件(并非只是一些图像,还可以是音频、视频等等) ,并且可以在Qt需要文件名的大多数地方使用它们。第12章将对此做进一步说明 。

相关标签: Qt笔记 qt