Qt中的信号槽机制详解

一、关于Qt

我们都知道Qt是一个用于做gui界面开发的框架,Qt拥有强大的组件开发机制,Qt同时也是一个跨平台的C++界面开发框架,他和MFC不太一样,MFC主要是专注于windows上的界面开发。Qt中比较有特点的东西也就是信号槽机制,在讲信号槽机制之前,我们将说一下Qt中一些比较基础的东西。

1、Qt中常用的快捷键
1)、帮助文档的转换,F1可以查看帮助文档,两次F1可以将文档全凭显示。
2)、.h和.cpp文件的转换,快捷键为F4
3)、编译并且运行:Ctrl + R
4)、函数的声明和定义之间的转换:F2
5)、代码的注释与取消:Ctrl + /
6)、字体的大小写变换:Ctrl + 鼠标滚轮向上向下
7)、移动代码:选中所要移动的代码 -> 按住 ctrl + shift -> 键盘方向键
8)、查找替换关键字:ctrl + f
9)、快速打开代码所在目录:编辑模式下 -> 选中项目文件 -> 右击 -> 选择“显示包含的目录”,即可显示项目所在目录(此方法同样可以打开代码文件所在目录)

2、如何查看Qt的帮助文档
1)、类使用的相关介绍
2)、查看所有部件类的相应的成员函数(功能、参数、返回值)
3)、查看部件的信号
4)、查看部件的部件(所对应的虚函数如何编写)

这里写图片描述
这里写图片描述
这里写图片描述

公有成员函数:操作部件属性的相关函数。
公有槽函数:Qt类中已经定义好的槽函数,直接可与信号相连接。
信号:软中断,如按下按钮触发 pressed() 信号等。
保护成员函数:通常事件所对应的虚函数放在此处。
事件:常用事件,如操作鼠标触发的鼠标事件。
文档使用简单介绍到这来,它里面没有什么有难度的东西。

3、Qt中的基本模块
1)、Qt widgets
2)、Qt WebKit
3)、Qt Test
4)、Qt Sql
5)、Qt quick
6)、Qt Qml
7)、Qt Multimedia Widgets
8)、Qt Core
9)、Qt gui
10)、Qt network
11)、Qt Multimedia
12)、Qt quick Control
13)、Qt quick dialog

4、Qt中的窗口继承关系
这里写图片描述

5、Qt中的内存回收机制
1)、 类直接或间接从QObject类派生
2)、给这个类指定父类

二、Qt中的信号槽机制
Qt中的信号槽由信号和槽函数构成,所以接下来我们先聊聊信号和槽函数
1、信号
1)、是一个函数
a. 这个函数不需要实现, 只声明就可以
b. 使用关键字 signals 限定
2)、 信号函数返回值: void
3)、 可以重载
4)、信号可以连接信号
5)、信号可以连接多个槽函数
connect(sender, sig, recv, slot1);
connect(sender, sig, recv, slot2);
connect(sender, sig, recv, slot3);
connect(sender, sig, recv, slot4);
6)、 多个信号可以链接同一个槽函数

2、槽函数
* 槽函数
1)、qt5中的槽函数, 类的成员函数, 全局函数, 静态函数, lambda表达式(C++11的新特性, 匿名函数)
2)、 返回值void
3)、可以重载
4)、参数需要跟信号的参数一一对应
void sig(int, double, QStirng)
void slot(int, double, QStirng)
5)、 槽函数的参数个数 小于 信号的参数个数 — 可以
6)、槽函数的参数个数 大于 信号的参数个数 — 不可以
7)、 自定义槽函数 – 一般的时候添加一个类的成员函数(C++)

3、Qt4的信号槽

connect(sender, SINGAL(sig(int, QString), receiver, SLOT(slot(int, QString));

两个宏 SINGAL, SLOT 将函数名转换为字符串
qt4缺陷:
不安全, 宏替换的时候不会做错误判断

案例代码:
pro文件中的代码

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = HelloQt
TEMPLATE = app
SOURCES += main.cpp\
        mywidget.cpp \
    mybutton.cpp \
    subwidget.cpp
HEADERS  += mywidget.h \
    mybutton.h \
    subwidget.h
CONFIG += c++11

main文件中的代码:

#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv)
    MyWidget w;
    w.show();
    return a.exec();
}

头文件mywidget.h中的代码

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "mybutton.h"
#include "subwidget.h"
class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
public slots:
    void mySlot();
    void showMainWindow(QString str);

signals:
    void aaa(); 

private:
    QPushButton* m_btn1;
    MyButton *m_btn2;
    SubWidget m_sub;   
};
#endif 

头文件subwidget.h中的代码:

#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = 0);
signals:
    void mainShow();
    void mainShow(QString);
public slots:
    void subSlot();
private:
    QPushButton* btn;
};
#endif 

源文件mywidget.cpp中的代码

#include "mywidget.h"
#include <QDebug>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("0105");
    this->setWindowIcon(QIcon("D:\\face.png"));
    m_btn1 = new QPushButton(this);
    m_btn1->setText("hello, Qt");
    m_btn1->move(100, 100);
    m_btn2 = new MyButton(this);
    m_btn2->move(200, 200);
    m_btn2->show();
    void (SubWidget::*func1)() = &SubWidget::mainShow;
    connect(&m_sub, func1, this, &MyWidget::show);
    connect(m_btn2, &MyButton::clicked, this, [=]()
    {
        m_btn1->setText("aaaa");
    });
}
MyWidget::~MyWidget()
{

}

void MyWidget::mySlot()
{
    m_btn2->setText("aaa");
    m_sub.show();
    this->hide();
}

void MyWidget::showMainWindow(QString str)
{
    qDebug() << str.toUtf8().data();
}

源文件subwidget.cpp中的代码:

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
   btn = new QPushButton(this);
    btn->move(200, 200);
    void (SubWidget::*func1)() = &SubWidget::mainShow;
    connect(btn, &QPushButton::clicked, this, &SubWidget::subSlot);
    connect(btn, &QPushButton::clicked, this, func1);
}

void SubWidget::subSlot()
{
    emit mainShow("aaa!!!");
    this->hide();
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

The_Web3_社区

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

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

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

打赏作者

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

抵扣说明:

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

余额充值