这学期的C++大作业是结合Qt做一个医院的病人排 系统,所以最近在学习Qt。最好的学习方法就是实践,多动手做一些东西才能了解和熟悉Qt的那些库函数,周五晚上做了个记事本小软件,实现了大部分微软记事本的功能。写下留存记录。
来几张效果图吧:
小软件的主要功能包括:
- 新建文件,打开文件,保存文件,文件另存为
- 撤销,重做
- 复制,剪切,粘贴
- 改变字体,改变字体颜色
第一部分:
一个一个慢慢说。首先是软件的基本界面,有了界面再添加功能。构成界面的主体就是菜单栏,工具栏和文本区域。
菜单栏:
上面代码声明三个菜单项,然后再添加到菜单栏,Qt里一个menuBar()函数返回主窗口的菜单栏。也可以像下面这样用QMenuBar声明一个菜单栏:
因为我是直接在MainWindow窗口直接写的代码,就用menuBar()函数了。将菜单项添加到菜单栏:
在每个菜单项下面有好几个功能,比如File菜单下有新建,打开,保存,另存为,打印,退出功能,在Qt里每一个功能作为一个动作,即QAction,这与java不同,java里每一个菜单项的子项是menuItem。声明子菜单项(以File菜单为例):
在Edit,Help菜单下的那些子项也像上面那样声明就行了,这里就不贴代码里。接下来就是实例化每一个动作,以newAct为例:
上面三行代码中,第一句实例化一个动作,第一个参数设置它的Icon,即图标,第二个参数是名字,第三个参数是父对象,this指当前窗口。函数原型如下:
第二句代码设置快捷键。第三行代码设置状态栏信息,状态栏在软件的下面,当鼠标停在该动作上时在状态栏左边显示的信息。
接下来就是把这些action添加到菜单项下面。addAction()函数负责完成这个功能,如下:
addSeparator()函数是在两个动作之间加一条分割线。
依葫芦画瓢其他的一些菜单子项也是这么个步骤,不再详述。接下来是工具栏。
工具栏
当新建工程时主窗口是自带工具栏的,那便是mainToolBar,所以不必另外再定义新的工具栏,直接在它上面添加动作就行了。添加动作和添加分割线的函数与菜单栏一样,示例代码如下:
文本区域
statusBar()函数获取主窗口的状态栏,addPermanentWidget()函数添加永久性部件,永久性意味着它不会被临时信息所覆盖,添加到状态栏右边。刚才在菜单栏设置每个动作的信息时,显示的信息是在状态栏左边。然后就是写一个函数获得鼠标光标的位置信息,并把信息显示在Label上。
最后,也是最重要的一步,谁来调用这个函数们怎么知道鼠标光标的位置改变了呢就要说到Qt最厉害的地方了,信 与槽。简单来说:槽就是响应函数,信 就是给响应函数发的消息,意思是这个消息一产生,相应的函数就要执行。就像电影《集结 》里,集结的 声一响你就可以撤退了,这里 声就是信 ,撤退就是槽。一行代码如下:
函数原型:
参数说明:
- const QObject * sender :发出信 的对象
- const char * signal : 信
- const QObject * receiver : 接收信 的对象
- const char * method : 槽
- Qt::ConnectionType type = Qt::AutoConnection : 连接方式,已经设定为自动连接了,多数情况下不用考虑这个参数
在我们那行代码里,发出信 的对象是文本区域,即textEdit,信 是鼠标光标的位置变了,cursorPositionChanged()函数返回这个信息,这个函数式Qt提供的,接收信 的对象是当前主窗口,槽就是showTextInfo()函数,实时改变状态栏右下角的信息。
第二部分
各个功能的实现。菜单栏一共就三个选项File,Edit,Help,一个一个说。
Edit
Edit菜单项下面有五个子项(动作),分别是:
- Undo :撤销
- Redo :重做
- Cut :剪切
- Copy :复制
- Paste :粘贴
这些功能Qt里都提供了函数实现,所以这部分功能就是连接信 与槽就行了,并且那些快捷键操作Qt也实现了。代码如下:
刚开始我并不知道Qt提供了这些函数,就自己写了复制和粘贴的函数,当写剪切的函数时,看文档发现Qt已经实现了这些个函数,就拿来用吧。有现成的轮子何必再自己造轮子呢!把自己写的那两个函数的代码也贴上来吧:
Help
Help菜单项就一个子菜单–about,弹出一个消息窗口,上面显示一些我想说的信息。它的动作名是aboutAct。槽是actAboutAuthor()函数。
File
File菜单下有六个子项
- New :新建
- Open :打开
- Save :保存
- Save As :另存为
- Print :打印,这个功能是调用打印机的,没实现
- Quit :退出程序
当要新建,打开其他文件或退出程序时,需要判断当前的文件内容是不是被修改了,如果被修改了,就要提醒用户是不是要保存当前文件,所以需要一个函数来返回这个信息。函数如下:
当保存文件时,还要判断这个文件是不是存在,如果存在直接保存就好,如果不存在,就要新建一个文件再保存,相当于另存为了。currentFile是全局QString变量,指当前的文件名,如果为空说明需要另外建一个文件保存当前文本信息,就调用另存为的响应函数;非空就直接在当前文件下保存内容。
另存为的槽函数如下,getSaveFileName()函数弹出文件保存对话框并返回文件名。第三个参数是默认路径和默认文件名,第四个参数是文件过滤器。如果是一个过滤器多个文件的话,文件后缀以空格分开,如:
如果是多个过滤器的话,过滤器之间用两个分 隔开,如
槽函数代码如下:
saveFile()函数代码如下:
新建文件的槽函数如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!