在前面两节中,实现了界面的设计(菜单项)和子窗口类的实现,下一步就是实现菜单项的功能,就是把菜单项和子窗口类的成员函数关联起来。
1. 项目文件
2. mainwindow.h 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "mdichild.h"
#include <QMainWindow>
#include <QMdiSubWindow>
#include <QSignalMapper>
class QSignalMapper;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
MdiChild* createMdiChild(); // 创建子窗口
void setActiveSubWindow(QWidget* window); // 设置活动子窗口
void updateMenus(); // 更新菜单
void updateWindowMenu(); // 更新“窗口”菜单
void on_actionNew_triggered(); // New 槽函数
void on_actionOpen_triggered(); // open 槽函数
void on_actionSave_triggered(); // save 槽函数
void on_actionUndo_triggered(); // undo 槽函数
void on_actionClose_triggered(); // close 槽函数
void on_actionAbout_triggered(); // about 槽函数
void on_actionAboutQt_triggered(); // AboutQt 槽函数
void on_actionExit_triggered(); // exit 槽函数
void on_actionSaveAs_triggered(); // saveAs 槽函数
private:
Ui::MainWindow *ui;
QAction* actionSeparator; // 间隔器, 窗口菜单下的
MdiChild* activeMdiChild(); // 返回一个活动窗口的指针,没有窗口时,返回0
QMdiSubWindow* findMdiChild(const QString& fileName); // 查找子窗口
QSignalMapper* windowMapper;
void readSettings(); // 读取窗口设置
void writeSettings(); // 写入窗口设置
protected:
void closeEvent(QCloseEvent* event); // 关闭事件
};
#endif // MAINWINDOW_H
可以看出,mainwindow中成员函数大多都是槽函数,槽函数中除了菜单项的槽函数外,还有一些槽函数来响应子窗口的变化,例如,当主窗口中没子窗口时,save, saveAs,close等菜单项是不可用的。没选中一些文字时,cut copy 是不可用的。还有如下图所示,在窗口菜单中显示打开子窗口的文件列表。
3.mainwindow.cpp 源文件
(1)构造函数
在构造函数中先把私有成员变量 actionSeparator 设置为间隔器,这个间隔器就是在“窗口”菜单中的
“Prev(V)”下面的间隔器。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
actionSeparator = new QAction(this); // 创建action
actionSeparator->setSeparator(true); // 把这一 action 设置为 分隔器
updateMenus(); // 更新菜单&#x