qt之使用自定义的信号与槽

前面简单讲述了qt的信号与槽机制和如何建立信号与槽的两种方法,但是前面所使用的信号是qt本身已经编写好的,今天我们来学习如何使用自己编写的信号函数(信号与槽本身就是函数,前面已经讲过)并且发送字符串信息。

首先,是这次用到的代码:

#ifndef CHILDDIALOG_H
#define CHILDDIALOG_H

#include <QDialog>

namespace Ui {
class ChildDialog;
}

class ChildDialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::ChildDialog *ui;

public slots:
    void getTextFromFather(QString);

};

#endif // CHILDDIALOG_H

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}
class ChildDialog;

class Dialog : public QDialog
{
    Q_OBJECT

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

private:
    Ui::Dialog *ui;
    ChildDialog * child;

signals:
    void giveText(QString);

private slots:
    void workOnValues();

};

#endif // DIALOG_H
#include "childdialog.h"
#include "ui_childdialog.h"

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

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

void ChildDialog::getTextFromFather(QString text)
{
    ui->lineEdit->setText(text);
}

#include "dialog.h"
#include "childdialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    child = new ChildDialog(this);
    connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(workOnValues()));
    connect(this,SIGNAL(giveText(QString)),child,SLOT(getTextFromFather(QString)));
//connect(ui->lineEdit,SIGNAL(textChanged(QString)),child,SLOT(getTextFromFather(QString)));

    child->show();
}

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

void Dialog::workOnValues()
{
    QString s = ui->lineEdit->text();
    s=s.toUpper();
    emit giveText(s);
}

#include "dialog.h"
#include <QApplication>

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

    return a.exec();
}

前面两段代码是头文件,接下来的是具体的实现,最后一段是主函数。这里我们只关注这几行代码

signals:
    void giveText(QString);

private slots:
    void workOnValues();
public slots:
    void getTextFromFather(QString);

上面那个就是定义了信号函数,下面那个定义的是槽(看那个signals和slots)。然后是这行代码

emit giveText(s);

这个就是在发送信号。再来看一下connect函数

 connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(workOnValues()));
    connect(this,SIGNAL(giveText(QString)),child,SLOT(getTextFromFather(QString)));
第一个函数的意义是:

由ui->lineEdit这个对象发出textChange的信号,然后this指的这个对象做出反应执行workValues函数,第二个同理。

可能有人会问为什么没有 emit textChange来发送信号,这是因为这个信号函数是qt本身写好的就像之前的那个clicked信号不需要发送。同时,在发送信号的时候传递了字符串信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值