1 Action 的简介和例子:

ref:https://www.devbean.net/2012/08/qt-study-road-2-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 应用程序所需要的各个资源。我们可以使用普通文本编辑器打开这个文件:

XHTML
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()函数,将这个QActiontriggered()信号与MainWindow类的open()函数连接起来。当用户点击了这个QAction时,会自动触发MainWindowopen()函数。这是我们之前已经了解过的。

下面的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 的方法相关推荐

  1. QT中ui更改后不能更新的解决方法

    QT中ui更改后不能更新的解决方法 参考文章: (1)QT中ui更改后不能更新的解决方法 (2)https://www.cnblogs.com/qiaozhoulin/p/4509939.html 备 ...

  2. .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)

    本片博文接上一篇:.NET多线程执行函数,给出实现一个线程更新另一个线程UI的两种方法. Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直接调用该 ...

  3. WPF多线程UI更新——两种方法

    WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  4. Qt创建多线程的两种方法

    来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run ...

  5. 【转】探讨android更新UI的几种方法----不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...

  6. 在Qt中设置程序图标的方法介绍

    本文主要介绍在 Qt 中设置程序图标的方法. 说明: 本文中的应用程序是面向 Windows 操作系统的: 本文中使用的 Qt Creator 版本号为:7.0.0: 本文中使用的 Qt 版本号为:5 ...

  7. 安卓更新UI的几种方法

    安卓更新UI的几种方法: 1.利用Looper更新UI界面   如果我们的代码需要随时将处理后的数据交给UI更新,那么我们想到的方法就是另开一个线程更新数据(也必须这么做,如果我们的数据更新运算量较大 ...

  8. Qt延时处理的四种方法

    Qt延时处理的四种方法 这里提供四种方法: 1. 多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait( ...

  9. QT多线程的使用(moveToThread方法)

    QT有两种实现多线程的方法,一种是"子类化QThread,然后去重写run函数,实现多线程".一种是"子类化QObject,然后使用moveToThread函数实现多线程 ...

最新文章

  1. 腾讯开源框架Angel推出3.0版本:全栈机器学习平台
  2. [To be translated] Nova:libvirt image 的生命周期
  3. iOS进阶之架构设计MVVM模式实践(11)
  4. 对“相亲节目整风”的看法
  5. 老王讲设计模式(八)——适配器模式
  6. 自测-2 素数对猜想
  7. vm虚拟机win7安装镜像方法
  8. 大数据的应用:九大领域
  9. 程序员的英文简历编写参考
  10. python能制作ppt动画效果吗_那些超酷的视频效果,真的是用PPT动画做的吗?
  11. 阿里妈妈不能攻百度也不能守淘宝 !
  12. 2022网易最新版本将军令算法刨析(2)
  13. 机器学习数学原理(1)——极大似然估计法
  14. 47件产品入选北极星建筑奖,包括北京朝阳站、望朝中心、前海腾讯数码大厦等地标亮点 | 美通社头条...
  15. GRUB4DOS(六) find命令的实现
  16. 线程池和信号量模拟酒店(旅店)预定房间
  17. 下一半***清除全集
  18. 论文阅读:2021.11.23~2021.12.1
  19. 第五章 Java中的String类和StringBuffer(上)
  20. 爬取妹子图某张图片的一点心得

热门文章

  1. leetcode 字符串中的第一个唯一字符
  2. Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
  3. 【网站】给网站添加一个夜间模式切换按钮
  4. 面向对象设计原则之7-迪米特法则
  5. 如何持之以恒做好一件事?
  6. postman使用指南
  7. azure 使用_如何使用JavaScript在Azure上开始使用SignalR
  8. linux升级openssh8.2,openssh7更换升级位8.2版本过程
  9. java模式设计视频教程_全新JAVA设计模式详解视频教程 完整版课程
  10. java final char_java基本数据类型总结 类型转换 final关键字的用法