找回密码
 立即注册
收起左侧

第4篇 基础(四)添加菜单图标——使用Qt资源文件

133
回复
118829
查看
  [复制链接]
累计签到:1568 天
连续签到:1 天
来源: 2013-3-25 19:55:14 显示全部楼层 |阅读模式
添加菜单图标——使用Qt资源文件

版权声明

该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!


导语

       后面几篇里我们将介绍常用的Qt主窗口部件QMainWindow,主窗口部件就是一般的应用程序主窗口,它包含了菜单栏、工具栏、中心部件、状态栏和可停靠部件等。这一篇将着重介绍菜单的实现以及使用资源文件来添加菜单图标。

环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1


目录

一、添加主窗口菜单
二、添加菜单图标
三、添加资源文件
四、使用资源文件
五、使用代码来添加菜单和图标

正文


一、添加主窗口菜单

1.新建Qt Gui应用,项目名称为myMainWindow,基类选择QMainWindow,类名为MainWindow

2.创建完项目后,打开mainwindow.ui文件进入设计模式。在这里可以看到界面左上角的“在这里输入”,我们可以在这里添加菜单。双击“在这里输入”,将其更改为“文件(&F)”,然后按下回车键,效果如下图所示。这里的&F表明将菜单的快捷键设置为了Alt+ F,可以看到,实际的显示效果中&符号是隐藏的。

3.同样的方法,我们在文件菜单中添加“新建(&N)”子菜单,效果如下图所示。菜单后面的那个加号图标是用来创建下一级菜单的。

二、添加菜单图标

1.Qt中的一个菜单被看做是一个Action,我们在下面的Action编辑器中可以看到刚才添加的“新建”菜单,如下图所示。

2.双击该条目,会弹出编辑动作对话框,这里可以进行各项设置,比如我们可以设置菜单的快捷键,点击一下快捷键后面的行编辑器,然后按下键盘上的Ctrl + N,这样就可以将该菜单的快捷键设置为Ctrl + N。如下图所示。那么大家可能会问,既然该菜单的快捷键是这么设置的,那么前面设置的“新建(N)”中的N是什么呢?这个可以被称为加速键,就是只有当文件菜单处于激活(显示)状态时,按下N键才会执行新建菜单的功能。

3.在编辑动作对话框中的图标后面的黑色箭头下拉框可以选择使用资源还是使用文件,如果使用文件的话,那么就可以直接在弹出的文件对话框中选择本地磁盘上的一个图标文件。下面我们来讲述使用资源的方式,如果直接点击这个按钮就是默认的使用资源。现在我们先按下编辑动作对话框的确定按钮关闭它。

三、添加资源文件

1.Qt中可以使用资源文件将各种类型的文件添加到最终生成的可执行文件中,这样就可以避免使用外部文件可能出现的一些问题。而且,在编译时Qt还会将资源文件进行压缩,我们可能发现生成的可执行文件比我们添加到其中的资源文件还要小。

2.我们向项目中添加新文件,模板选择Qt资源文件。如下图所示。然后将名称设置为myResources


3.创建完文件后会自动打开该资源文件,这里需要先在下面添加前缀,就是点击添加按钮,然后选择前缀,默认的前缀是“/new/prefix1”,这个可以随意修改(不要出现中文字符),我们这里因为要添加图片,所以修改为/myImages。然后再按下添加按钮来添加文件,这里最好将所有要用到的图片放到项目目录中。比如我们这里在项目目录中新建了一个images文件夹,然后将需要的图标文件粘贴进去。添加完文件后,如下图所示。

4.当添加完资源后,一定要按下Ctrl + S来保存资源文件,不然在后面可能无法显示已经添加的资源。

四、使用资源文件

1.我们重新到设计模式打开新建菜单的编辑动作对话框,然后添加图标。在打开的选择资源对话框中,第一次可能无法显示已经存在的资源,可以按下左上角的绿箭头来更新显示。效果如下图所示。

2.我们点击这里需要的新建图标filenew.png,按下确定即可。现在按下Ctrl + R键运行程序,效果如下图所示。

五、使用代码来添加菜单和图标

1.对于添加的资源文件,在项目目录中可以看到,即myResources.qrc,使用写字板程序将其打开,可以发现它其实就是一个XML文档:
<RCC>
    <qresourceprefix="/myImages">
       <file>images/filenew.png</file>
       <file>images/fileopen.png</file>
       <file>images/filesave.png</file>
       <file>images/filesaveas.png</file>
       <file>images/find.png</file>
    </qresource>
</RCC>

2.前面是在设计模式添加的图标文件,下面我们使用代码再来添加一个菜单,并为其设置图标。在编辑模式打开mainwindow.cpp文件,并在构造函数中添加如下代码:

// 创建新的动作
QAction *openAction = new QAction(tr("&Open"), this);
// 添加图标
QIcon icon(":/myImages/images/fileopen.png");
openAction->setIcon(icon);
// 设置快捷键
openAction->setShortcut(QKeySequence(tr("Ctrl+O")));
// 在文件菜单中设置新的打开动作
ui->menu_F->addAction(openAction);

       这里添加图标时,就是使用的资源文件中的图标。使用资源文件,需要在最开始使用冒号,然后添加前缀,后面是文件的路径。在代码中使用文件菜单,就是使用其objectName。大家现在可以运行程序查看效果,当然这里也可以将Open改为中文。


结语

       这一篇中主要讲解了如何使用资源文件,讲述了在设计模式和代码中两种使用方法。希望大家可以亲自练习一下本篇的内容,在后面的章节中,对于添加菜单和图标等操作将不再进行讲解。




涉及到的源码下载:
图标文件集合:下载



上一篇:第3篇 Qt登录对话框

下一篇:第5篇 Qt布局管理器

返回:系列教程目录  




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 11人气 +18 收起 理由
buling + 2 对我帮助很大!
Bravo + 1 很详细!
qq307922494 + 1 很实用!
531873600 + 2 对我帮助很大!
hbbtsk + 2 对我帮助很大!
zhujunwen + 2 很详尽的笔记!
hedongbuyi + 1 小白 膜拜下
丶厉岩c + 2
一代菜鸟 + 2 对我帮助很大!
maduidui + 1 很实用!
^小P孩^ + 2 必须支持!

查看全部评分总评分 : 人气 +18

回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2013-6-22 14:26:54 显示全部楼层
遇到一点问题,就是在输入"新建(&N)"的时候,新建两个汉字始终输入不进去,最后还是在Action编辑器中改成汉字的。不知道有没有谁遇到过这种情况?
回复 支持 1 反对 0

使用道具 举报

尚未签到

2013-4-8 13:04:45 显示全部楼层
ui->menu_F中的那个F是第一次创建时的那个快捷键把,为什么编译会出现错误那,把_F去掉就好了

点评

在设计模式下,Menu_F是对应的菜单类的对象名而已  发表于 2013-9-8 22:53
这里的F表示文件的意思。或许你那里有冲突了吧!  发表于 2013-4-9 19:41
回复 支持 反对

使用道具 举报

尚未签到

2013-4-22 10:22:52 显示全部楼层
这篇教程中的下面一行

// 设置快捷键
openAction->setShortcut(QKeySequence(tr("Ctrl+O")));

直接改成 openAction->setShortcut(tr("Ctrl+O"));
就可以了!
回复 支持 反对

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-5-28 11:40:24 显示全部楼层
ui->menu_F   也是出现了错误,提示 错误:'class Ui::MainWindow' has no member named 'menu_F' ;   我在界面模式下,右边对象查看器中的menuBar中找到了menu,把它改成menu_F就好了。可能是这两个地方的命名要对应吧。
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-1 12:41:20 显示全部楼层
:-1: 错误:No rule to make target `../MyMeunWF/images/email.png', needed by `debug/qrc_myimages.cpp'.  Stop.
这个是什么意思啊,我之前有这个图片,后来我把它删了,换别的图片,就出现这个错了,不知道是哪里的。
回复 支持 反对

使用道具 举报

累计签到:84 天
连续签到:1 天
2013-6-1 13:24:54 显示全部楼层
caikeyter 发表于 2013-6-1 12:41
:-1: 错误:No rule to make target `../MyMeunWF/images/email.png', needed by `debug/qrc_myimages.cpp'. ...

解决了。MyMeunWF-build-desktop 这个目录删了,重新编译就行了。

点评

这目录在代码目录的上一级目录  发表于 2016-11-23 11:33
参与人数 1人气 +2 收起 理由
xzmoji + 2 对我帮助很大!

查看全部评分总评分 : 人气 +2

回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-6-23 17:34:57 显示全部楼层
tuqiao820 发表于 2013-6-22 14:26
遇到一点问题,就是在输入"新建(&N)"的时候,新建两个汉字始终输入不进去,最后还是在Action编辑器中改成汉 ...

应该不会啊。可以关闭Qt Creator,重新打开运行试试。
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2013-6-23 21:56:44 显示全部楼层
yafeilinux 发表于 2013-6-23 17:34
应该不会啊。可以关闭Qt Creator,重新打开运行试试。

试过了。不行。我还换了几个输入法,都不行。可能是我用的win8和Qt5的兼容性有一点点问题。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-6-23 22:21:44 显示全部楼层
tuqiao820 发表于 2013-6-23 21:56
试过了。不行。我还换了几个输入法,都不行。可能是我用的win8和Qt5的兼容性有一点点问题。 ...

用win8啊。嗯,应该是这样了。
回复 支持 反对

使用道具 举报

尚未签到

2013-7-10 20:05:01 显示全部楼层
你们好!我用的是Debian linux 7.0+QT4.8.2;我用两种方法,菜单都不显示图标。不知道那里有问题了。编译没有问题。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-7-14 20:09:21 显示全部楼层
pandacnc 发表于 2013-7-10 20:05
你们好!我用的是Debian linux 7.0+QT4.8.2;我用两种方法,菜单都不显示图标。不知道那里有问题了。编译没 ...

可能是系统问题。debian没有测试过。
回复 支持 反对

使用道具 举报

尚未签到

2013-7-14 23:46:46 显示全部楼层
本帖最后由 pandacnc 于 2013-7-14 23:48 编辑

谢谢你的分享和回复。遇到问题,我当晚(凌晨了)还是没有解决,第二天我搜索了一些东西,问题解决了,是系统默认设置菜单不显示图标(icons)。现在解决了。

如果遇到这个问题的朋友,请你安装gconf-editor然后在其中搜索menu have icons就可以找到设置项了。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-7-14 23:51:36 显示全部楼层
pandacnc 发表于 2013-7-14 23:46
谢谢你的分享和回复。遇到问题,我当晚(凌晨了)还是没有解决,第二天我搜索了一些东西,问题解决了,是系 ...

嗯。好的。以后发现了一些这样的问题都可以分享出来啊!这样其他人可以少走弯路。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2013-7-18 17:24:21 显示全部楼层
新建第一級菜單可以用漢字,第二級菜單就不能輸漢字了, 有時候第二級菜單怎麼都添加不進字符,亂點就OK了。
用的是搜狗輸入法,xp系統,可以解第二級菜單不能輸漢字的問題嗎?現在只能在屬性欄修改。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-7-18 21:44:44 显示全部楼层
cwhow 发表于 2013-7-18 17:24
新建第一級菜單可以用漢字,第二級菜單就不能輸漢字了, 有時候第二級菜單怎麼都添加不進字符,亂點就OK了。
...

这个还真是没有遇到过。可以找个别的电脑试试看,如果没有问题,就是电脑系统环境的原因。如果还是有问题,就是自己程序或者Qt Creator安装的问题。
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2013-7-19 10:24:04 显示全部楼层
yafeilinux 发表于 2013-7-18 21:44
这个还真是没有遇到过。可以找个别的电脑试试看,如果没有问题,就是电脑系统环境的原因。如果还是有问题 ...

好的 謝謝回覆  謝謝你的教程
回复 支持 反对

使用道具 举报

累计签到:29 天
连续签到:1 天
2013-7-21 10:49:15 显示全部楼层
本帖最后由 cctry_songchao 于 2013-7-21 10:56 编辑
yafeilinux 发表于 2013-6-23 22:21
用win8啊。嗯,应该是这样了。

yafeilinux 您好,我在做第4篇 (四) 添加菜单图标这讲遇到了几个问题:
1.我按照上面的例子进行操作,使用资源文件的方式添加菜单图标是没有问题的,但是我新建了一个工程
试着使用代码来添加菜单图标,但是编译说:找不到menu_F,这个不是ui的成员啊,我看了一下你的工程,我感觉你是在使用资源的基础上又实现了代码方式添加是有menu_F,请问我的理解是否正确,我新建工程要按照代码形式添加菜单图标我该怎么做呢?

我查看了一下我的对象查看器:里面没有menu_F   只有menuBar  mainToolBar   statusBar等。

2.您使用代码添加菜单式在上面的基础上添加了一个子菜单,但是这时候我要是新建工程用代码实现从顶层菜单开始添加又该如何添加呢?   (顶级菜单就是:从文件(F)到开始添加)。

3.显示中文是乱码的问题?


回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2013-7-21 11:03:25 显示全部楼层
cctry_songchao 发表于 2013-7-21 10:49
yafeilinux 您好,我在做第4篇 (四) 添加菜单图标这讲遇到了几个问题:
1.我按照上面的例子进行操作,使用 ...

嗯,如果你要用纯代码实现,那么需要从menuBar开始,因为默认的MainWindow类只提供了一个menuBar,而没有提供菜单。可以这样:

QMenu *fileMenu = ui->menuBar->addMenu(tr("文件"));
QAction *openAction = fileMenu->addAction(tr("打开"));

是用tr来解决中文问题,然后在主函数中第一行代码后面添加:

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));

当然,也可以使用国际化来解决中文问题,一般测试程序就用前面这种临时解决办法,如果是正式的发布程序,最好用国际化来完成,那样比较正规。
回复 支持 反对

使用道具 举报

累计签到:29 天
连续签到:1 天
2013-7-21 11:55:13 显示全部楼层
yafeilinux 发表于 2013-7-21 11:03
嗯,如果你要用纯代码实现,那么需要从menuBar开始,因为默认的MainWindow类只提供了一个menuBar,而没有 ...

yafeilinux 您好还有个问题:
1.其他的问题都解决了,但是我给菜单加载图标的时候出现没有显示啊。
QMenu *fileMenu = ui->menuBar->addMenu(tr("文件(F)"));
    QAction *openAction = fileMenu->addAction(tr("新建(N)"));
    openAction->setShortcut(QKeySequence(tr("Ctrl+F")));

    QIcon icon1("D:\QTProject\menu2\Images\window-new.png");
    openAction->setIcon(icon1);
    fileMenu->addAction(openAction);
纯代码添加。我给的是图标的全路径,也试过冒号那种方式了也不成功。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了