QT 008 UI Add action 的方法
1 Action 的简介和例子:
Qt 使用QAction
类作为动作。顾名思义,这个类就是代表了窗口的一个“动作”,这个动作可能显示在菜单,作为一个菜单项,当用户点击该菜单项,对用户的点击做出响应;也可能在工具栏,作为一个工具栏按钮,用户点击这个按钮就可以执行相应的操作。有一点值得注意:无论是出现在菜单栏还是工具栏,用户选择之后,所执行的动作应该都是一样的。因此,Qt 并没有专门的菜单项类,只是使用一个QAction
类,抽象出公共的动作。当我们把QAction
对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
QAction
包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。当把一个QAction
对象添加到程序中时,Qt 自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把QAction
对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了QAction
的图标,那么在工具栏上面这个QAction
所对应的按钮的图标也会同步修改。
下面我们来看看如何在QMainWindow
中使用QAction
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
// !!! Qt 5
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void open();
QAction *openAction;
};
#endif // MAINWINDOW_H
// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));
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);
statusBar() ;
}
MainWindow::~MainWindow()
{
}
void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}
|
上面的代码分别属于两个文件:mainwindow.h 和 mainwindow.cpp。为了让 MainWindow 运行起来,我们还需要修改 main() 函数如下:
1
2
3
4
5
6
7
8
9
|
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow win;
win.show();
return app.exec();
}
|
当我们编辑好文件,点击运行,可以看到MainWindow
的运行结果:
这是一个相对完整的程序。首先,我们在MainWindow
类中添加了一个私有函数open()
和一个私有变量openAction
。在 MainWindow 的构造函数中,第一行我们调用了setWindowTitle()
,设置主窗口的标题。注意我们的文本使用tr()
函数,这是一个用于 Qt 国际化的函数。在后续章节中我们可以看到,我们可以使用 Qt 提供的国际化工具,将tr()
函数的字符串提取出来,进行国际化。由于所需进行国际化的文本应该被大多数人认识,所以,tr()
函数里面一般会是英文文本。
然后,我们在堆上创建了openAction
对象。在QAction
构造函数,我们传入了一个图标、一个文本和 this 指针。我们将在后面的文章中解释 this 指针的含义。
图标我们使用了QIcon
,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。Qt 资源文件的后缀名是 qrc。如果我们使用 Qt Creator,我们可以在新建文件中看到 Qt 资源文件。Qt 资源文件其实是一个 XML 描述的文件,表示 Qt 应用程序所需要的各个资源。我们可以使用普通文本编辑器打开这个文件:
1
2
3
4
5
|
<RCC>
<qresource prefix="/images">
<file alias="doc-open">document-open.png</file>
</qresource>
</RCC>
|
我们会在后面的章节中详细介绍 Qt 资源文件(注意,资源文件需要在 pro 文件中使用 RESOURCES 引入。)。这里只需要了解,QIcon
的参数,以 : 开始,意味着从资源文件中查找资源。:/images/doc-open
就是找到了这里的 document-open.png 这个文件。(我们使用的是 png 格式的图片,这是 Qt 内置支持的图片格式。其他格式的图片,比如 jpg、gif 则需要插件支持。这些插件实际已经随着 Qt 一同发布。)
QAction
第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。注意看截图中 File 的 F 有一个下划线。
下面一句,我们使用了setShortcut()
函数,用于说明这个QAction
的快捷键。Qt 的QKeySequence
为我们定义了很多内置的快捷键,比如我们使用的 Open。你可以通过查阅 API 文档获得所有的快捷键列表。 这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")
来实现快捷键。原因在于,这是 Qt 跨平台性的体现。比如 PC 键盘和 Mac 键盘是不一样的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用QKeySequence
类来添加快捷键,会根据平台的不同来定义相应的快捷键。
setStatusTip()
则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
后面的connect()
函数,将这个QAction
的triggered()
信号与MainWindow
类的open()
函数连接起来。当用户点击了这个QAction
时,会自动触发MainWindow
的open()
函数。这是我们之前已经了解过的。
下面的menuBar()
、toolBar()
和statusBar()
三个是QMainWindow
的函数,用于创建并返回菜单栏、工具栏和状态栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,并且把这个QAction
对象添加到这个菜单;同时新增加了一个 File 工具栏,也把QAction
对象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。至于状态栏,则是出现在窗口最下方,用于显示动作对象的提示信息的。
至于open()
函数中的内容,我们会在后文介绍。这里可以运行一下,你会看到,触发这个动作,程序会弹出一个提示框。
下面是 Qt 4 版本的程序,具体非常类似,这里不再赘述。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
// !!! Qt 4
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void open();
private:
QAction *openAction;
};
#endif // MAINWINDOW_H
// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));
openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
statusBar();
}
MainWindow::~MainWindow()
{
}
void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}
|
2 加入ACTION的方法
2.1 通过UI加入action,
http://blog.csdn.net/donyac/article/details/47072609
在使用Qt创建桌面程序的时候,经常会使用Qt designer来设计程序界面。
而Qt窗口类中,QMenuBar和QToolBar中并没有按钮或选项类的控件,取而代之的是要向这些控件中添加QAction。这一个个Action构成了类似按钮似的“控件”。
网上很多在源代码中添加QAction的方法。实际上,在Qt designer中也可以方便的想菜单栏和工具栏添加action。
方法如下:
1、打开动作编辑器。
如果找不到动作编辑器,请点击Qt designer的菜单栏的“视图”-“动作编辑器”。
2、在动作编辑器窗口添加新的动作
【案】其实这边就完成了,不要忘记了重新构建一下。ui的h文件就加了你的定义
3、拖动该动作到菜单栏或状态栏
【案】其实拖动只是连接到菜单栏的点击, UI设计出来的action,其实在.UI文件里面已经定义出来,可以直接使用,方法和非UI加入的action一样。
你想怎么用就真没用,没有限制。
用的时候很简单,也是扁平的调用,
ui->你的action 就可以了,不要加任何其他中间的指向指针,我就犯了这个错误。
此外,如果QT creator如果没有高亮你的定义,那么就是ui设计的action还没有正确书写。
大功告成
如果想为改Action设置响应函数,可以将该Action的Triggered()信号与想要的槽函数相连。
如
//连接信号和槽
connect(ui.actionInputFlightData,SIGNAL(triggered()),this,SLOT(testTra()));
2.2 通过代码加入action
http://blog.csdn.net/qhyka/article/details/73136804
部分代码如下:
pAction = m_pTableMenu->addAction("删除记录");
connect(pAction, SIGNAL(QAction::triggered(bool)), this, SLOT(DelRecord(bool)));
后来莫名奇妙程序报错了,输出信息如下:
QObject::connect: No such signal QAction::QAction::triggered(bool) in ..\Project1\mainwindow.cpp:47
QObject::connect: (receiver name: 'MainWindow')
才知道信号参数不需要写类限定,修改如下:
pAction = m_pTableMenu->addAction("删除记录");
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(DelRecord(bool)));
【案】action只是表示ui上的一个动作,主要是针对菜单显示而言,比如他有很多ui特性,设定快捷键啊,设定是否可选,设定工具提醒啊,设定ICON,都是和ui相关。
那么实际逻辑上的action,你还是要用信号和曹连接一下。不过这样搞的很想一个button,不过没有办法,你想想菜单设计的时候不能嵌入一个button,不过,个人觉得这个东西的设定完全为了实现菜单而搞的。当然,当遇到表格使用的时候,这个东西还是有点意义。
2.3 在table里面的运用:
我可以定义一个表格相关的action,比如: insertRowAction
然后用:insertRowAction->setEnable(enableIns)的方法来跳出来插入表的数据,这个就比在原来的表单上修改要好玩一点。
QT 008 UI Add action 的方法相关推荐
- QT中ui更改后不能更新的解决方法
QT中ui更改后不能更新的解决方法 参考文章: (1)QT中ui更改后不能更新的解决方法 (2)https://www.cnblogs.com/qiaozhoulin/p/4509939.html 备 ...
- .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
本片博文接上一篇:.NET多线程执行函数,给出实现一个线程更新另一个线程UI的两种方法. Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直接调用该 ...
- WPF多线程UI更新——两种方法
WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...
- Qt创建多线程的两种方法
来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run ...
- 【转】探讨android更新UI的几种方法----不错
原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
- 在Qt中设置程序图标的方法介绍
本文主要介绍在 Qt 中设置程序图标的方法. 说明: 本文中的应用程序是面向 Windows 操作系统的: 本文中使用的 Qt Creator 版本号为:7.0.0: 本文中使用的 Qt 版本号为:5 ...
- 安卓更新UI的几种方法
安卓更新UI的几种方法: 1.利用Looper更新UI界面 如果我们的代码需要随时将处理后的数据交给UI更新,那么我们想到的方法就是另开一个线程更新数据(也必须这么做,如果我们的数据更新运算量较大 ...
- Qt延时处理的四种方法
Qt延时处理的四种方法 这里提供四种方法: 1. 多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait( ...
- QT多线程的使用(moveToThread方法)
QT有两种实现多线程的方法,一种是"子类化QThread,然后去重写run函数,实现多线程".一种是"子类化QObject,然后使用moveToThread函数实现多线程 ...
最新文章
- 腾讯开源框架Angel推出3.0版本:全栈机器学习平台
- [To be translated] Nova:libvirt image 的生命周期
- iOS进阶之架构设计MVVM模式实践(11)
- 对“相亲节目整风”的看法
- 老王讲设计模式(八)——适配器模式
- 自测-2 素数对猜想
- vm虚拟机win7安装镜像方法
- 大数据的应用:九大领域
- 程序员的英文简历编写参考
- python能制作ppt动画效果吗_那些超酷的视频效果,真的是用PPT动画做的吗?
- 阿里妈妈不能攻百度也不能守淘宝 !
- 2022网易最新版本将军令算法刨析(2)
- 机器学习数学原理(1)——极大似然估计法
- 47件产品入选北极星建筑奖,包括北京朝阳站、望朝中心、前海腾讯数码大厦等地标亮点 | 美通社头条...
- GRUB4DOS(六) find命令的实现
- 线程池和信号量模拟酒店(旅店)预定房间
- 下一半***清除全集
- 论文阅读:2021.11.23~2021.12.1
- 第五章 Java中的String类和StringBuffer(上)
- 爬取妹子图某张图片的一点心得
热门文章
- leetcode 字符串中的第一个唯一字符
- Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
- 【网站】给网站添加一个夜间模式切换按钮
- 面向对象设计原则之7-迪米特法则
- 如何持之以恒做好一件事?
- postman使用指南
- azure 使用_如何使用JavaScript在Azure上开始使用SignalR
- linux升级openssh8.2,openssh7更换升级位8.2版本过程
- java模式设计视频教程_全新JAVA设计模式详解视频教程 完整版课程
- java final char_java基本数据类型总结 类型转换 final关键字的用法