QT 菜单栏、工具栏和状态栏的Demo演示 +事件

菜单栏、工具栏和状态栏
大多数图形用户界面都会提供菜单栏和工具栏,以便用户对那些常用的功能进行快速访问。
Qt 通过“动作(Action)”的概念简化了有关菜单和工具栏的编程。一个动作(action)
是一个可以添加到任意数量的菜单和工具栏上的项。创建菜单和工具栏主要包括以下步骤:
 创建并且设置动作;
 创建菜单并且把动作添加到菜单上;
 创建工具栏并且把动作添加到工具栏上。

程序清单 的 mainwindow.h 源代码
1 /* mainwindow.h */
2 #ifndef MAINWINDOW_H
3 #define MAINWINDOW_H
4
5
#include <QMainWindow>
/* 包含对 QMainWindow 的定义 */
6
7 class QAction;
8 class QMenu;
9 class QToolBar;
10 class QLabel;
11
12 class MainWindow : public QMainWindow
13 {
14
15
/* 声明 MainWindow 为 QMainWindow 的子类*/
Q_OBJECT;
public:
16 MainWindow(void);
17 ~MainWindow(void);
18
19
private:
20 QMenu *fileMenu; /* 文件菜单 */
21 QMenu *helpMenu; /* 帮助菜单 */
22
23
QToolBar *fileToolBar; /* 工具栏 */
25 QAction *openAction; /* 打开动作 */
26 QAction *closeAction; /* 关闭动作 */
27 QAction *aboutAction; /* 关于动作 */
24
28
29
30
QLabel
*statusLabel;
};
31
32
#endif
该头文件主要添加了一些私有成员的声明,如第 20 到 29 行的私有成员变量。对于这些
私有变量,使用了它们的类前置声明(第 7 到 10 行)。这样就不用包含与这些类相关的头文件(如<QMenu>、<QLabel>等),可以使编译过程更快一些。接下来主要看一下更新的 mainwindow.cpp 源码,具体实现如程序清单 14.11 所示。
程序清单修改后的 mainwindow.cpp 源代码
1
/* mainwindow.cpp */
2
3 #include <QtGui>
4 #include "mainwindow.h"
5
6
7
MainWindow::MainWindow(void)
{
8 openAction = new QAction(tr("&Open"), this); /* 创建打开动作 */
9 openAction->setStatusTip(tr("Open the file")); /* 设置状态提示 */
11 closeAction = new QAction(tr("&Close"), this); /* 创建关闭动作 */
12 closeAction->setStatusTip(tr("Close the file")); /* 设置状态提示 */
14 aboutAction = new QAction(tr("&About"), this); /* 创建关于动作 */
15 aboutAction->setStatusTip(tr("About")); /* 设置状态提示 */
17 fileMenu = menuBar()->addMenu(tr("&File")); /* 创建 file 菜单 */
18 fileMenu->addAction(openAction); 19 fileMenu->addAction(closeAction);
10
13
16
20
21 helpMenu = menuBar()->addMenu(tr("&Help"));
22 helpMenu->addAction(aboutAction);
/* 创建 help 菜单 */
23
24 fileToolBar = addToolBar(tr("&File")); /* 创建 File 工具栏 */
25 fileToolBar->addAction(openAction); /* 添加打开动作到 File 工具栏*/
26 fileToolBar->addAction(closeAction); /* 添加关闭动作到工具栏 */
27 fileToolBar->addAction(aboutAction); /* 添加关于动作到工具栏 */
28
29 statusLabel = new QLabel; 30 statusLabel->setMinimumSize(statusLabel->sizeHint()); 31 statusLabel->setAlignment(Qt::AlignHCenter); /* 设置居中 */
statusBar()->addWidget(statusLabel); /* 添加状态标签到状态栏 */
32
33
34
}
35
36
MainWindow::~MainWindow(void)
37 {
38 }
第 8 至 15 分别创建不同的项,在字符串周围的 tr 函数调用是把它们翻译成其他语言的
标记。每个 QObject 对象以及包含有 Q_OBJECT 宏的子类中都有这个函数的声明。尽管应
用程序并没有要翻译成其他语言的打算,但是在用户可见的字符串周围使用 tr()是一个很不
错的习惯。
在这些字符串中,使用了“&”来表示快捷键,用户可在支持快捷键的平台下通过按快
捷键激活,如本例的按下 Alt + O 激活 Open 动作。
在 Qt 中,菜单都是 QMenu 的实例。QmainWindow::menuBar 函数返回一个指向
QMenuBar 的指针,菜单栏会在第一次调用 menuBar 函数的时候就创建出来。第 17 至 19 行
创建了 file 菜单后,把 Open 和 Close 动作添加进去。通过类似的方法创建 help 菜单。
创建工具栏与创建菜单的过程很相似,第 24 至 27 行创建了 file 工具栏,添加了 Open、
Close 和 About 的动作。
状态栏位于主窗口的最下方,用于显示状态提示消息。QMainWindow::statusBar 函数返
回一个指向状态栏的指针,第一次调用 statusBar 函数的时候会创建状态栏。状态栏指示器
是一些简单的 QLabel。
main.cpp 文件不用改变,重新调用 qmake-qt4 命令进行编译,然后执行查看效果,命令
如下:
vmuser@Linux-host:~/mainwindow$ qmake-qt4 –project
vmuser@Linux-host:~/mainwindow$ qmake-qt4
vmuser@Linux-host:~/mainwindow$ make
该代码在 Ubuntu 上的执行效果如图 所示。添加了菜单栏的 mainwindow 界面


事件
事件(event)是由窗口系统或者 Qt 自身产生的,用于响应所发生的各类事情。当用户
按下或者松开键盘或者鼠标上的按键时,就会产生一个键盘或者鼠标事件。当用户改变窗口
的大小的时候也会产生一个绘制窗口的事件。刚才谈到的事件都是对用户的操作做出响应而
产生的,还有一些事件是系统独立产生的,如定时器事件。
由于有信号与槽的机制,一般不需要考虑事件,在发生某些重要的事情时,Qt 窗口部
件都会发射信号。但是当需要编写自定义的窗口部件,或者希望改变已经存在的 Qt 窗口部
件的行为,事件就变得十分有用。

不应该把“事件”和“信号”这两个概念混淆。事件关注的是窗口部件本身的实现,而
信号关注的是窗口部件的使用。例如,当使用 QPushButton 时,用户更多关注该窗口部件是
否有被人点击使用,即对它的 clicked 信号更为关注。而很少关心发射该信号的底层鼠标或
者键盘事件。除非是要自定义一个类似 QPushButton 的类(窗口部件本身),就需要编写一
定的处理鼠标和键盘事件的代码。
所有组件的父类 QWidget 定义了很多事件处理函数,如 keyPressEvent 函数、
keyReleaseEvent 函数、 muuseDoubleClickEvent 函数、 mouseMoveEvent 函数、 mousePressEvent
函数和 mouseRelease 函数等。
下面通过自定义一个标签的子类,当用户点击鼠标、移动鼠标和释放鼠标后,在该窗口
部件中显示鼠标当前的坐标。该实例由三个文件组成:main.cpp、coordinate_label.h 和
coordinate_label.cpp。
coordinate_label.h 源码如程序清单所示。
程序清单coordinate_label.h 源代码
1
/* coordinate_label.h */
2
3 #ifndef COORDINATE_LABEL_H
4 #define COORDINATE_LABEL_H
5
6
#include <QLabel>
7
8
class QMouseEvent;
9
10 class CoordinateLabel : public QLabel
11 {
12 protected:
/* 自定义 QLabel 的子类 */
13 void mousePressEvent(QMouseEvent *event); /* 定义鼠标按下事件 */
14 void mouseMoveEvent(QMouseEvent *event); /* 定义鼠标移动事件 */
15 void mouseReleaseEvent(QMouseEvent *event); /* 定义鼠标释放事件 */
16
};
17
18
#endif
第 13 至 15 行声明需要重定义的事件处理函数。具体代码实现在 coordinate_label.cpp 文
件中,源码如程序清单 所示。
程序清单coordinate_label.cpp 源码
1
/* coordinate_label.cpp */
2
3 #include <QMouseEvent>
4 #include "coordinate_label.h"
5
6 void CoordinateLabel::mousePressEvent(QMouseEvent *event)
7 {
8
this->setText(QString("Mouse Press at:[%1, %2]")
9 .arg(event->x())
10 .arg(event->y()));
11
}
12
13 void CoordinateLabel::mouseMoveEvent(QMouseEvent *event)
14 {
15
this->setText(QString("Mouse Move at:[%1, %2]")
16 .arg(event->x())
17 .arg(event->y()));
18
}
19
20 void CoordinateLabel::mouseReleaseEvent(QMouseEvent *event)
21 {
22
this->setText(QString("Mouse Release at:[%1, %2]")
23 .arg (event->x())
24 .arg(event->y()));
25
}
类 QString 的具体用法可以查阅帮助文档,在本例中,将自定义的 QLabel 的子类
CoordinateLabel,设置其文本显示为当前鼠标事件的 x 轴与 y 轴。main.cpp 的源码如程序清单 所示。
程序清单 main.cpp 源代码
1
/* main.cpp */
2
3 #include <QApplication>
4 #include "coordinate_label.h"
5
6 int main(int argc, char *argv[])
7 {
8 QApplication app(argc, argv);

9 CoordinateLabel *myLabel = new CoordinateLabel; 10 myLabel->setWindowTitle("Mouse Event Demo"); /* 设置窗口标题 */
11 myLabel->resize(300,200); /* 设置自定义的窗口部件尺寸*/
12 myLabel->show();

13 return app.exec();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#君君#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值