/****************************************************** * 课程名 :QT编程 * 时 间 :2017年6月2日(周五)上午 + 下午前半段 * 工程名 :06-signalSlot-1 * 类 名 : signaldialog1 * 内 容 :信号和槽 * :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))); }四种情况讲述完成。
源代码: