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)));}
四种情况讲述完成。
源代码:
- Qt基础 05_信号和槽(一)
- Qt基础 06_信号和槽(二)自定义信号和槽的实例
- qt基础学习1_信号和槽的操作
- 【QT】信号和槽机制(一)
- Qt基础: 信号和槽
- Qt笔记_信号和槽
- QT基础(四)----信号和槽
- Qt学习笔记(一)信号和槽
- QT的信号和槽函数的使用(一)
- 【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽
- QT 笔记一(信号与槽)
- QT 多线程信号与槽(一)
- QT 多线程信号与槽(一)
- Qt信号-槽源码解析(一)
- QT之信号槽(一)
- Qt信号和槽
- QT信号和槽
- QT信号和槽
- kafka集群监控之KafkaOffsetMonitor 0.4.1版本 以及用sbt编译KafkaOffsetMonitor
- Java
- 高考与超实数微积分
- Android-->输入框自动提示文本, 失去焦点自动输入
- sessionStorage 、localStorage 和 cookie 之间的区别
- Qt基础 05_信号和槽(一)
- angularjs手机webapp 利用input拍照,图库选择上传图片
- Activity转屏重建之 Activity.onConfigurationChanged
- Java面试居然有这么多学问,看看高级程序员面试题是什么样的
- java中网络编程的InetAddress类
- 通过链接选用系统自带邮箱打开邮箱地址
- Azure云Linux虚拟机修复_fstab修改错误导致无法连接
- 用vs软件学习文件处理时遇到这个问题IntelliSense: incorrectly formed universal character name
- SQL 基于列的逻辑表达式 (CASE)