在之前的《添加动作》一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction可以添加到菜单上、工具栏上。期间,我们还详细介绍了一些细节问题,比如资源文件的使用、对象模型以及布局管理器。这一节则是详细介绍关于菜单栏、工具栏以及状态栏的相关内容。

我们假设窗口还是建立在QMainWindow类之上,这会让我们的开发简单许多。当然,在实际开发过程中,QMainWindow通常只作为“主窗口”,对话框窗口则更多地使用QDialog类。我们会在后面看到,QDialog类会缺少一些QMainWindow类提供方便的函数,比如menuBar()以及toolBar()

下面还是回到《添加动作》一文中的代码片段:

 
 
1
2
3
4
5
6
7
8
9
10
openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, &QAction::triggered, this, MainWindow::open);
 
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
 
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);

我们看到,使用menuBar()函数,Qt 为我们创建了一个菜单栏。menuBar()QMainWindow提供的函数,因此你是不会在QWidget或者QDialog中找到它的。这个函数会返回窗口的菜单栏,如果没有菜单栏则会新创建一个。这也就解释了,为什么我们可以直接使用menuBar()函数的返回值,毕竟我们并没有创建一个菜单栏对象啊!原来,这就是menuBar()为我们创建好并且返回了的。

Qt 中,表示菜单的类是QMenuBar(你应该已经想到这个名字了)。QMenuBar代表的是窗口最上方的一条菜单栏。我们使用其addMenu()函数为其添加菜单。尽管我们只是提供了一个字符串作为参数,但是 Qt 为将其作为新创建的菜单的文本显示出来。至于 & 符号,我们已经解释过,这可以为菜单创建一个快捷键。当我们创建出来了菜单对象时,就可以把QAction添加到这个菜单上面,也就是addAction()函数的作用。

下面的QToolBar部分非常类似。顾名思义,QToolBar就是工具栏。我们使用的是addToolBar()函数添加新的工具栏。为什么前面一个是menuBar()而现在的是addToolBar()呢?因为一个窗口只有一个菜单栏,但是却可能有多个工具栏。如果我们将代码修改一下:

 
 
1
2
3
4
5
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
 
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);

我们看到,现在有两个工具栏了:

工具栏可以设置成固定的、浮动的等等,具体设置可以参考 Qt 文档。

前面我们说过,使用QAction::setStatusTip()可以设置该动作在状态栏上的提示文本。但我们现在把鼠标放在按钮上,是看不到这个提示文本的。原因很简单,我们没有添加一个状态栏。怎么添加呢?类似前面的QMainWindow::menuBar()QMainWindow有一个statusBar()函数。让我们把这个函数添加上去:

 
 
1
2
3
4
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
 
statusBar();

然后编译运行一下:

我们添加了一个孤零零的statuBar()显得不伦不类,但是,同前面的menuBar()的实现类似,这个函数会返回一个QStatusBar对象,如果没有则先创建再返回。

QStatusBar继承了QWidget,因此,我们可以将其它任意QWidget子类添加到状态栏,从而实现类似 Photoshop 窗口底部那种有比例显示、有网格开关的复杂状态栏。有关QStatusBar的更多信息,请参考 Qt 文档。

对于没有这些函数的QDialog或者QWidget怎么做呢?要记得,QToolBar以及QStatusBar都是QWidget的子类,因此我们就可以将其结合布局管理器添加到另外的QWidget上面。QLayout布局提供了setMenuBar()函数,可以方便的添加菜单栏。具体细节还是详见文档。

至此,我们已经将组成窗口元素介绍过一遍。结合这些元素以及布局管理,我们就应该可以实现一个简单的通用的窗口。当我们完成窗口布局之后,我们就可以考虑向其中添加功能。这就是我们后面章节的内容。

Qt 学习之路 :菜单栏、工具栏和状态栏的更多相关文章

  1. Qt 学习之路 2(12):菜单栏、工具栏和状态栏

    Home / Qt 学习之路 2 / Qt 学习之路 2(12):菜单栏.工具栏和状态栏 Qt 学习之路 2(12):菜单栏.工具栏和状态栏  豆子  2012年9月10日  Qt 学习之路 2  2 ...

  2. Qt 学习之路 2(8):添加动作

    Home / Qt 学习之路 2 / Qt 学习之路 2(8):添加动作       [在WINDOWS10 QTCREATOR MENU添加无效]   Qt 学习之路 2(8):添加动作  豆子   ...

  3. Qt 学习之路 2(7):MainWindow 简介

    Qt 学习之路 2(7):MainWindow 简介  豆子  2012年8月29日  Qt 学习之路 2  29条评论 前面一篇大致介绍了 Qt 各个模块的相关内容,目的是对 Qt 框架有一个高屋建 ...

  4. 《Qt 学习之路 2》目录

    <Qt 学习之路 2>目录 <Qt 学习之路 2>目录  豆子  2012年8月23日  Qt 学习之路 2  177条评论 <Qt 学习之路 2>目录 序 Qt ...

  5. Qt 学习之路 2(31):贪吃蛇游戏(1)

    Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知 ...

  6. Qt 学习之路 2(17):文件对话框

    Home / Qt 学习之路 2 / Qt 学习之路 2(17):文件对话框 Qt 学习之路 2(17):文件对话框  豆子  2012年9月24日  Qt 学习之路 2  85条评论 在前面的章节中 ...

  7. Qt 学习之路 2(11):布局管理器

    Home / Qt 学习之路 2 / Qt 学习之路 2(11):布局管理器 Qt 学习之路 2(11):布局管理器  豆子  2012年9月4日  Qt 学习之路 2  70条评论 所谓 GUI 界 ...

  8. Qt 学习之路 2(10):对象模型

    Home / Qt 学习之路 2 / Qt 学习之路 2(10):对象模型 Qt 学习之路 2(10):对象模型  豆子  2012年9月2日  Qt 学习之路 2  45条评论 标准 C++ 对象模 ...

  9. Qt 学习之路 2(3):Hello, world!

     豆子  2012年8月22日  Qt 学习之路 2  107条评论 想要学习 Qt 开发,首先要搭建 Qt 开发环境.好在现在搭建 Qt 开发环境还是比较简单的.我们可以到 Qt 官方网站找到最新版 ...

  10. QT学习之路--创建一个对话框

    Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...

随机推荐

  1. UML for Design Pattern

    ************************************************************************************* ************** ...

  2. Use_Case

    What is Use-Case 2.0?Use Case: A use case is all the ways of using a system to achieve a particular ...

  3. 安装linux系统后要做的事情

    基本安装0 http://www.kali.org.cn/thread-20517-1-1.html 基本安装1 http://defcon.cn/1618.html 基本安装2 http://www ...

  4. 越狱开发:用iosOpenDev配置越狱开发环境 编写第一个hello world-b

    上网搜索越狱环境搭建,查到iosOpenDev软件,是个很方便的编写插件,而且可以直接用Xcode创建的工具,便开始着手学习如何去安装 集合了网上的方法后,我安装的时候发现: 1.作者最后更新的时间是 ...

  5. Delphi FireMonkey使用UniDAC 连接MySQL

    首次用Delphi XE6 开发安卓程序,并没有在网上找到连接远程MySQL服务器的文档,自己摸索一番,发现UniDAC控件新版本也已支持了FireMonkey下的开发.遂记下连接方法和大家分享. 1 ...

  6. bzoj AC 50 庆祝~~

    No. 1050 Solved 50 Submit 212 AC 60 PE 6 WA 88 TLE 13 MLE 5 OLE 2 RE 29 CE 9 10001002100310041005 10 ...

  7. [BZOJ 3894] 文理分科 【最小割】

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

  8. DLL ActiveForm 线程同步问题

    本文试着从分析Synchronize同步执行的实现机制入手,来解决DLL/ActiveForm中线程同步的问题. 线程中进行同步时调用的Synchronize函数,仅仅是把调用调用线程.调用方法地址. ...

  9. WPF Image控件中的ImageSource与Bitmap的互相转换

    原文:WPF Image控件中的ImageSource与Bitmap的互相转换  1.从bitmap转换成ImageSource [DllImport("gdi32.dll", ...

  10. android开发之使用shape来画线,有一些注意点

    注意:Android3.0以上系统开始支持硬件加速特性hardwareAccelerated,默认是启用的.当你的某个activity用到了“虚线”效果的时候,必须要设置AndroidManifest ...