Qt基础 05_信号和槽(一)

/******************************************************
* 课程名 :QT编程
* 时 间 :2017年6月2日(周五)上午 + 下午前半段
* 工程名 :06-signalSlot-1
* 类 名 : signaldialog1
* 内 容 :信号和槽
* CSDN :Qt基础 05_信号和槽(一)
******************************************************/

一、信号和槽概述

信号发送对象:
1.定义(声明)信号
2.合适的时机/位置发射信号
信号接收对象:
1.定义(声明)一个槽函数(必须与信号匹配)
2.实现槽函数的业务功能

发送对象的信号与接收对象的槽函数必须建立连接:
connect(发送对象,发送的信号,接收对象,槽函数);

重点:当一个信号对应多个槽时,信号发送后槽的执行没有先后之分,是随机的

二、信号和槽的四种定义情况

1、情况一
发送对象:内部类已经定义好的信号,发送时机也是内部定义好的
接收对象:槽函数已内部定义好,并且已经实现了特定的业务功能

ui界面定义Button实现窗口最大化
新建一个Button,在构造函数中添加如下功能:

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

    //点击button,实现窗口最大化
    //F1 connect ,F1 SIGNAL ,F1 slot找到窗口部件的最大化工具
    connect(ui->pushButton_1,SIGNAL(clicked()),this,SLOT(showMaximized()));
}

主函数定义Button实现窗口最大化

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    signalDialog1 w;

    //用代码定义出一个Button,通过次Button实现窗口最小化功能

    //创建对象
    QPushButton *pbt = new QPushButton("最小化",&w);
    pbt->setGeometry(10,10,100,20);
    //pbt->show();

    //建立连接
    QObject::connect( pbt , SIGNAL( clicked()) ,&w, SLOT(showMinimized()) );
    w.show();

    return a.exec();
}

2、情况二
发送对象:内部类已经定义好的信号,发送时机也是内部定义好的
接收对象:槽函数自定义
步骤一:在signaldialog1.cpp中添加连接语句:
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(???) );
SLOT中无可用函数,需要自己定义——
步骤二:定义槽函数。在signaldialog1.h中进行如下槽函数定义:

private slots:
    void printMessage();

并使用Alt+Enter键自动在signaldialog1.cpp中添加定义,功能函数如下:

void signalDialog1::printMessage()
{
    qDebug() << "Button'printMessage'被点击";
}

步骤三:与信号连接。与情况1同理
ui界面定义Button实现控制台信息的打印
新建一个Button,在构造函数中添加如下功能:

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

     //连接,printMessage()为自定义槽函数
     connect(ui->printButton,SIGNAL(clicked()),this,SLOT(printMessage()) );

}

PS:细说“转到槽”
新建一个Button,右键“转到槽”,则
在signaldialog1.cpp中生成如下代码:

void signalDialog1::on_pushButton_clicked()
{
    qDebug() << "自动连接的槽函数";
}

在signaldialog1.h中生成如下代码:

private slots:
    void on_pushButton_clicked();

若不做“新建一个Button,右键‘转到槽’”这一步,而是自己手动写,则需遵守命名规则:on_对象名称_信号名称。否则,不会自动连接上

能自动连接的原因:在ui_signaldialog1.h中,void setupUi(QDialog *signalDialog1)函数里有一条”QMetaObject::connectSlotsByName(signalDialog1)”是自动生成的。

3、情况三
发送对象:内部类已经定义好的信号,发送时机也是内部定义好的
接收对象:槽函数自定义
目标:点击按钮后弹出提问对话框,用户选择后,在窗体的Label中输出对应信息
步骤一:添加头文件#include < QMessageBox >
步骤二:新建一个Label;新建一个Button,右键“转到槽”;
步骤三:定义信号。在signaldialog1.h中定义信号:

signals:
    void showName(QString name);

步骤四:发送信号。
使用Alt+Enter键自动在signaldialog1.cpp中添加定义,功能函数如下:

void signalDialog1::on_pushButton_2_clicked()
{
    int ret = QMessageBox::question(this,"提问","是否显示学校名称?",QMessageBox::Yes,QMessageBox::No);
    if( QMessageBox::Yes == ret)
    {
        //label显示名称

        //1.信号发送
        emit showName("南昌航空大学");
    }
}

步骤四:信号和槽函数连接。
在构造函数添加代码:

signalDialog1::signalDialog1(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::signalDialog1)
{
    ui->setupUi(this);
    //情况3:
    //点击按钮,弹窗,用户选择后,在控制台输出对应信息
    connect(this,SIGNAL(showName(QString)),ui->label,SLOT(setText(QString)) );
}

4、情况四
发送对象:信号自定义
接收对象:槽函数自定义
步骤一:定义槽函数在signaldialog1.h中进行如下槽函数定义:

public slots:
    void showLabelText(QString name);

步骤二:槽函数发送数据。

新建一个Button,右键“转到槽”;

void signalDialog1::on_pushButton_3_clicked()
{
    qDebug() << "已获取到信息";
    QString str = "要发送的信息";

    //发送数据
    emit showText(str);
}

显示信息:

void signalDialog1::showLabelText(QString text)
{
    qDebug() << "已获取到的信息:" << text;
    ui->label_2->setText("获取到的信息是:" + text);
}

步骤三:定义信号。在signaldialog1.h中定义信号:

signals:
    void showText(QString text);

步骤四:信号和槽函数连接。
在构造函数添加代码:

signalDialog1::signalDialog1(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::signalDialog1)
{
    ui->setupUi(this);
    //情况4:
    //点击按钮,弹窗,用户选择后,在控制台输出对应信息
    connect(this,SIGNAL(showText(QString)),this,SLOT(showLabelText(QString)));
}

四种情况讲述完成。

源代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值