接下来的几章将介绍如何制作在上一章提到的window记事本程序,这个程序本身并不复杂,但因为为需要穿插介绍一些其他内容,所以这个过程会显得比较长。在这一章里将先演示窗体的制作。
菜单栏不在程序中,始终位于最上方,这是ubuntu系统的问题和Qt无关,ubuntu系统设置外部程序的菜单栏只能位于最上方,所以到这里菜单栏”失踪“的现象
我们先把程序的界面做好,完成后的程序应该是这个样子的
这个窗体使用了QMainWindow,这个窗体最大的作用特点就是提供了菜单栏,工具栏,状态栏等常见的窗体元素,你也可以依据需要在上面创建滚动条等,这些功能都是通过QMainWindow的成员函数来实现。他还有一个非常重要作用就是可以将另一个窗体部件指定为他自身的中心窗体
在这个程序里,使用了QTextEdit来做为中心窗体,和上一章使用的面向行的文本编辑窗体QLineEdit相比,QTextEdit的功能更加适合大段的文本编辑。
这个程序通过继承QMainWindow类来实现,我把他成为ReadMe,先来看他的头文件ReadMe.h
#include<QMainWindow>
#include<QTextEdit>
#include<QAction>
#include<QMenuBar>
#include<QMenu>
class ReadMe:public QMainWindow
{
private:
QAction* Open_Action; //注释1
QAction* New_Action;
QAction* Save_Action;
QAction* SaveAs_Action;
QAction* Close_Action;
QAction* Redo_Action;
QAction* Undo_Action;
QAction* Cut_Action;
QAction* Copy_Action;
QAction* Paste_Action;
QAction* Delete_Action;
QAction* Find_Action;
QAction* FindNext_Action;
QAction* SelectAll_Action;
QAction* DataAndTime_Action;
QAction* AutoChangeLine_Action;
QAction* LeftAlignment_Action;
QAction* RightAlignment_Action;
QAction* MidAlignment_Action;
QAction* Font_Action;
QAction* FindHelp_Action;
QAction* About_Action;
QMenuBar* FileMenu_MenuBar; //注释2
QMenu* File_Menu;
QMenu* Edit_Menu;
QMenu* Format_Menu;
QMenu* Help_Menu;
QTextEdit* MainEditWindow;
public:
ReadMe(QWidget* parent = 0);
private:
void CreateAction(); //注释3
void CreateMenu();
void CreateMenuBar();
};
注释1 :这里使用了大量的QAction(即动作),这些QAction的作用和他们的名字一样,打开,保存,另存
为,剪切,复制,等等,而这些动作最后都会被安装到菜单上
注释2 :这里有需要区别下菜单QMenu和菜单栏QMenuBar,其中QMenu在添加了各种动作(比如剪切,复
制等等)后成为一个正真的菜单(否则只是一个没用任何内容的空菜单),然后这些菜单按照你需要
的顺序添加到菜单栏上,这样就完成了菜单栏
注释3 :这里使用了3个私有函数来分别创建动作,菜单,和菜单栏,在构造函数中将会调用这些函数,这样可
以方便将来对程序的修改。
接下来就是实现这个头文件里的内容,首先看CreateAction()函数
void ReadMe::CreateAction()
{
Open_Action = new QAction(tr("打开"),this);
New_Action = new QAction(tr("新建"),this);
Save_Action = new QAction(tr("保存"),this);
SaveAs_Action = new QAction(tr("另存为..."),this);
Close_Action = new QAction(tr("关闭"),this);
Redo_Action = new QAction(tr("撤销"),this);
Undo_Action = new QAction(tr("恢复"),this);
Cut_Action = new QAction(tr("剪切"),this);
Copy_Action = new QAction(tr("复制"),this);
Paste_Action = new QAction(tr("粘帖"),this);
Delete_Action = new QAction(tr("删除"),this);
Find_Action = new QAction(tr("查询"),this);
FindNext_Action = new QAction(tr("查询下一个"),this);
SelectAll_Action = new QAction(tr("全选"),this);
DataAndTime_Action = new QAction(tr("日期/时间"),this);
AutoChangeLine_Action = new QAction(tr("自动换行"),this);
LeftAlignment_Action = new QAction(tr("左对齐"),this);
RightAlignment_Action = new QAction(tr("右对齐"),this);
MidAlignment_Action = new QAction(tr("中对齐"),this);
Font_Action = new QAction(tr("字体"),this);
FindHelp_Action = new QAction(tr("关于帮助"),this);
About_Action = new QAction(tr("关于记事本"),this);
}
代码比较长,但内容比较单一,这里创建了大量的动作QAction,他们对应的功能和他们的名字一样
然后是CreateMenu()函数
void ReadMe::CreateMenu()
{
File_Menu = new QMenu(tr("文件"));
File_Menu->addAction(Open_Action);
File_Menu->addAction(New_Action);
File_Menu->addAction(Save_Action);
File_Menu->addAction(SaveAs_Action);
File_Menu->addSeparator(); //注释1
File_Menu->addAction(Close_Action);
Edit_Menu = new QMenu(tr("编辑"));
Edit_Menu->addAction(Redo_Action);
Edit_Menu->addAction(Undo_Action);
Edit_Menu->addSeparator();
Edit_Menu->addAction(Cut_Action);
Edit_Menu->addAction(Copy_Action);
Edit_Menu->addAction(Paste_Action);
Edit_Menu->addAction(Delete_Action);
Edit_Menu->addSeparator();
Edit_Menu->addAction(Find_Action);
Edit_Menu->addAction(FindNext_Action);
Edit_Menu->addSeparator();//注释1
Edit_Menu->addAction(SelectAll_Action);
Edit_Menu->addAction(DataAndTime_Action);
Format_Menu = new QMenu(tr("格式"));
Format_Menu->addAction(AutoChangeLine_Action);
Format_Menu->addSeparator();
Format_Menu->addAction(LeftAlignment_Action);
Format_Menu->addAction(RightAlignment_Action);
Format_Menu->addAction(MidAlignment_Action);
Format_Menu->addSeparator();
Format_Menu->addAction(Font_Action);
Help_Menu = new QMenu(tr("帮助"));
Help_Menu->addAction(FindHelp_Action);
Help_Menu->addAction(About_Action);
}
注释1:同样代码很多,这里分别创建了文件,编辑,合适,帮助这四张菜单,然后将动作QAction添加值对应
的菜单,唯一需要注意的是类QMenu的成员函数addSeparator(),这个函数的作用是在菜单中”画“出一
条横向分割先
接下来轮到CreateMenuBar()函数
void ReadMe::CreateMenuBar()
{
FileMenu_MenuBar = menuBar(); //注释1
FileMenu_MenuBar->addMenu(File_Menu);
FileMenu_MenuBar->addMenu(Edit_Menu);
FileMenu_MenuBar->addMenu(Format_Menu);
FileMenu_MenuBar->addMenu(Help_Menu);
}
注释1:这章开始的时候说过,QMainWindow提供了菜单栏,需要的话调用对于的成员函数即可,这里就掉用
了成员函数menuBar(),这个函数的作用就是创立一个QMenuBar,用是返回一个指向QMenuBar的指针
然后就可以把菜单按照顺序安装到菜单栏上
最后是构造函数
ReadMe::ReadMe(QWidget* parent):QMainWindow(parent)
{
CreateAction(); //注释1
CreateMenu();
CreateMenuBar();
MainEditWindow = new QTextEdit; //注释2
setCentralWidget(MainEditWindow);
setWindowTitle(tr("记事本"));
}
注释1: 首先在构造函数中调用3个私有函数创建动作,菜单和菜单栏,这里注意他们调用的顺序
注释2:创建一个QTextEdit作为编辑文本的窗体,然后将这个窗体设为中心窗体(即调用setCentralWidget())
这里需要说明下,如果你在使用ubuntu系统,有可能会出现这个样子