在有图像界面的程序中,添加一些图片是很常见的事,这些图片可以作为log,背景等,而在这里演示的是将一些图片添加到菜单中,并作为工具栏的内容。
然后就可以在程序中使用这些图片了
注释1:这里调用statusBar()来生产一个状态栏,这个函数同时返回一个指向QStatusBar类型的指针,也就是这个函数生产的
然后在ReadMe.cxx文件中实现这个函数
Qt中使用一种qrc格式的文件来作为添加资源的文件,注意这里是添加的资源不限于图片,其他音频视频也可以这样添加。具体步骤:
1.在程序目录下新建一个images的子文件目录,然后将需要的图片放入这个子目录呢
2.建立一个qrc格式文件,例子中是pix.qrc,具体内容为XML格式
<RCC>
<qresource>
<file>images/center.png</file>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/delete.png</file>
<file>images/files.ico</file>
<file>images/left.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
<file>images/paste.png</file>
<file>images/read.png</file>
<file>images/re.png</file>
<file>images/right.png</file>
<file>images/saveAs.png</file>
<file>images/save.png</file>
<file>images/un.png</file>
</qresource>
</RCC>
在前面的例子中菜单文件和编辑上的一些动作(QAction)可以添加一个图片作为标识,在ReadMe.h文件中添加一个私有函数SetActionPix()来实现这个功能,这个函数具体实现如下
void ReadMe::SetActionPix()
{
New_Action->setIcon(QIcon(":/images/new.png")); //注释1
Open_Action->setIcon(QIcon(":/images/open.png"));
Save_Action->setIcon(QIcon(":/images/save.png"));
SaveAs_Action->setIcon(QIcon(":/images/saveAs.png"));
Redo_Action->setIcon(QIcon(":/images/re.png"));
Undo_Action->setIcon(QIcon(":/images/un.png"));
Cut_Action->setIcon(QIcon(":/images/cut.png"));
Copy_Action->setIcon(QIcon(":/images/copy.png"));
Paste_Action->setIcon(QIcon(":/images/paste.png"));
Delete_Action->setIcon(QIcon(":/images/delete.png"));
LeftAlignment_Action->setIcon(QIcon(":/images/left.png"));
RightAlignment_Action->setIcon(QIcon(":/images/right.png"));
MidAlignment_Action->setIcon(QIcon(":/images/center.png"));
}
注释1: 这里QIcon()函数用于返回一个指向QIcon类的指针,换个不太恰当的说法就是返回指向图片的指针,而
QAction的成员函数setIcon()则用于给动作添加图片
这样就完成了给菜单上的动作添加图片的工作,接下来的任务是给这个程序添加一个工具栏,在 QMainWindow中,成员函数addToolBar()用于添加一个工具栏,同时返回执行指向这个工具栏的指针,这个指针的类型是QToolBar*,在文件中添加包含这个类的头文件,同时在添加一个用于创建工具栏的私有函数CreateToolBar()来具体实现。
ReadMe.h文件应该添加下面的代码
#include<QToolBar>
//..
//.
QToolBar* FileTools_ToolBar;
QToolBar* EditTools_ToolBar;
QToolBar* FormatTools_ToolBar;
//..
CreateToolBar();
然后在ReadMe.cxx文件中实现这个函数的功能
void ReadMe::CreateToolBar()
{
FileTools_ToolBar = addToolBar(tr("文件")); //注释1
FileTools_ToolBar->addAction(New_Action);
FileTools_ToolBar->addAction(Open_Action);
FileTools_ToolBar->addAction(Save_Action);
FileTools_ToolBar->addAction(SaveAs_Action);
EditTools_ToolBar = addToolBar(tr("编辑"));
EditTools_ToolBar->addAction(Redo_Action);
EditTools_ToolBar->addAction(Undo_Action);
EditTools_ToolBar->addAction(Cut_Action);
EditTools_ToolBar->addAction(Copy_Action);
EditTools_ToolBar->addAction(Paste_Action);
EditTools_ToolBar->addAction(Delete_Action);
FormatTools_ToolBar = addToolBar(tr("格式"));
FormatTools_ToolBar->addAction(LeftAlignment_Action);
FormatTools_ToolBar->addAction(MidAlignment_Action);
FormatTools_ToolBar->addAction(RightAlignment_Action);
}
注释1: QMainWindow类的成员函数addToolBar()创建一个工具栏,同时返回指向这个工具栏的指针,然后就
可以向这个工具栏里添加动作(QAction),创建工具栏和创建菜单栏很相似,又有些区别,可以仔细对比
下CreateMenu(),CreateMenuBar()和CreateToolBar()的区别
接下来是个程序添加一个状态栏,一般状态栏位于程序的底部,用于说明某些功能的详细,QMainWindow类成员函数statusBar()会在第一次调用时创建一个状态栏,我们这里要做的是当鼠标悬停在菜单上的某个选项(即QAction)时,状态栏会给出这个选项的详细说明,而QAction类提供了一个成员函数setStatusTip()来实现这个功能,现在将这个功能整合到我们的程序ReadMe中
首先在ReadMe.h文件中添加一个私有函数
void CreateStatusBar();
然后在ReadMe.cxx文件中实现这个函数
void ReadMe::CreateStatusBar()
{
statusBar(); //注释1
New_Action->setStatusTip(tr("新建一个文件")); //注释2
Open_Action->setStatusTip(tr("打开一个文件"));
Save_Action->setStatusTip(tr("保存当前文件"));
}
的状态栏的指针,在我们这个例子中,由于只需要在状态栏上显示信息,默认的状态栏足以,所以对于返回的指针不
需要做什么,但如果有需要额外的功能,可以将这个函数的返回值复制给一个QStatusBar*,然后在继续操作
注释2: 这里使用了QAction的成员函数setStatusTip()来生成状态栏上的信息,以“新建”为例,当鼠标悬停在“文件”菜单上
的“新件”选项是,程序底部的状态栏上就会显示信息“新建一个文件”。这里我只设置了3个选项的状态信息,你也可
以根据程序的具体需求添加其他QAction选项的状态信息
对于一个程序来说,快捷键是必不可少的一部分,很多时候使用键盘会比使用鼠标更加方便,Qt也提供了一套关于快捷键的方法,以我们现在制作的这个程序为例,最简单的方法就是调用QAction的成员函数setShortcut()来实现快捷键的功能,
但这里遇到一个问题,不同的平台快捷键搜索不同,例如windows系统的Ctrl+c是复制的快捷键,但在Linux系统下Ctrl+c表示终止程序运行,为了解决不同平台快捷键冲突的问题,Qt提供了一个类QKeySquence来解决次问题。
首先在ReadMe.h中添加一个私有函数用于快捷键的创建
void SetHotKey()
void ReadMe::SetHotKey()
{
New_Action->setShortcut(QKeySequence::New); //注释1
Copy_Action->setShortcut(QKeySequence::Copy);
Paste_Action->setShortcut(QKeySequence::Paste);
}
注释1:以“打开”为例,其实这样里可以写成setShortcut("Ctrl+O")来实现功能,但就如前文所述,不同平台的快捷键是不完
全一样的(虽然Ctrl+O各平台都有相同功能,但不是每个快捷键都这样),所以用QKeySequence类实现比在代码中
写死要更加灵活,当代码需要跨平台是更加如此。QkeSequence提供了大量的快捷键,内容太多无法在这里全部列
出,可以在assistant中查询该类,看看里面是否有你需要的快捷键
到这里我们完成了记事本程序的大部分界面制作,下章开始我们将实现他的各项功能,这里再次给出ReadMe程序到目前为止的构造函数的完整代码
ReadMe::ReadMe(QWidget* parent):QMainWindow(parent)
{
CreateAction();
CreateMenu();
CreateMenuBar();
SetActionPix();
CreateToolBar();
CreateStatusBar();
SetHotKey();
MainEditWindow = new QTextEdit;
setCentralWidget(MainEditWindow);
FindWordsDialog = new FindDialog(this);
setWindowTitle(tr("记事本"));
ConnectSignalAndSlot();
}