Qt | 给菜单menubar子菜单QAction添加点击监听回调函数

Qt | 给菜单menubar子菜单QAction添加点击监听回调函数_第1张图片

例如给这个open菜单添加点击监听回调。

再此之前,先说一下qt的事件通信机制。

大多数框架对于事件的处理是采用发布订阅Subscribe/Publish模式,即把事件名和相应的回调函数注册到监听者列表中。通过操作事件分发者(EventDispatcher)来调度事件。

qt的信号-槽机制,类似观察者模式(Observer),组件把自己注册为观察者后,会监测程序运行中不断发出的信号流,若发现有与之匹配的信号后,则立即做出相应反应。

这两种方式比较,前者灵活,后者性能更强。

回到正题:

在设计好界面后,代码中会自动添加一个openAction(菜单名+Action)的QAction对象。(这个对象声明在ui_mainwindow.h里, qtcreator默认屏蔽此文件)

接下来,按照观察者模式的规则,在构造函数里把自身注册为一个观察者。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT());
    
}

MainWindow::~MainWindow()
{
    delete ui;
}

connect有4个参数,第一个是按钮行为QAction对象,第二个是响应信号类型,第三个是观察者自身,第四个是响应回调。

现在响应回调还没有定义,SLOT是槽,我们需要在槽里定义回调函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    
private slots:
    void observer_open();
    
};

#endif // MAINWINDOW_H

 槽函数声明在

private slots: 下

例如

void observer_open();

然后添加到观察者connect中

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(observer_open()));
    
}

MainWindow::~MainWindow()
{
    delete ui;
}

 定义observer_open

void MainWindow::observer_open(){
    qDebug("click");
}

 构建运行

测试

Qt | 给菜单menubar子菜单QAction添加点击监听回调函数_第2张图片

 成功触发监听回调。

 

完整代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void observer_open();

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(observer_open()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::observer_open(){
    qDebug("click");
}

 

你可能感兴趣的:(Qt)