/******************************************************
* 课程名 :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)));
}
四种情况讲述完成。
源代码: