信号和槽

1.信号和槽用于两个对象之间的通信。

2.当特殊的事情发生时便可以发射信号,而槽是一个函数,在信号发射后被调用来响应这个信号。

3.信号只用声明,不需要也不能对它进行定义实现。发射信号用emit关键字。信号没有返回值,只能是void类型的。

4.信号和槽的关联使用的是QObject类的connect()函数。

下面看一个例子:

//dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

signals:
    void giveText(QString s);//声明一个信号

private slots:
    void on_pushButton_clicked();//添加一个槽

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H
//dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"

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

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()//槽的实现
{
    QString s= ui->lineEdit->text();   //获取文本框内的字符串
    emit giveText(s);                          //发射信号
}        
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_action_triggered();//添加两个槽
    void putText(QString s);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
#include<dialog.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_action_triggered()
{
    Dialog * d = new Dialog();                 //声明一个对话框
    connect(d,&Dialog::giveText,this,&MainWindow::putText);//连接槽void putText()和信号void giveText(s)
    d->show();
}
void MainWindow::putText(QString s)
{
    ui->label->setText(s);//将标签设置为获取的字符串s
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>

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

    return a.exec();
}

最后效果为:

点击“子窗口”,发射信号。

输入“123456”,点击“确认”,并点击“OK”,发射信号。

父窗口如图所示。

posted @ 2017-05-08 20:37  奇热行  阅读(224)  评论(0)    收藏  举报