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

来源:互联网 发布:mac打不开word文档 编辑:程序博客网 时间:2024/06/05 11:32

/******************************************************
* 课程名 :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)));}

四种情况讲述完成。

源代码:

原创粉丝点击