槽的机制

参考:点击打开链接

 有时候我们需要在两个或者多个窗口之间同步信息,这时候我们就需要用到槽。请看下面的程序:(ui文件省略)

//dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {//在namespace Ui下声明了Dialog类
class Dialog;
}
class ChildDialog;//前置声明,Dialog类引用了ChildDialog类

class Dialog : public QDialog//Dialog类继承QDialog类
{
    Q_OBJECT

public://声明函数,定义在dialog.cpp
    explicit Dialog(QWidget *parent = 0);//声明为explicit的构造函数不能在隐式转换中使用
    ~Dialog();//析构函数

private:
    Ui::Dialog *ui;//在namespace Ui下定义Dialog类指针ui
    ChildDialog * child;//定义ChildDialog类指针child

};

#endif // DIALOG_H

//childdialog.h
#ifndef CHILDDIALOG_H
#define CHILDDIALOG_H

#include <QDialog>

namespace Ui {
class ChildDialog;//在namespace Ui下声明了ChildDialog类
}

class ChildDialog : public QDialog//ChildDialog类继承QDialog类
{
    Q_OBJECT

public://声明函数,定义在childdialog.cpp
    explicit ChildDialog(QWidget *parent = 0);//声明为explicit的构造函数不能在隐式转换中使用
    ~ChildDialog();//析构函数

private:
    Ui::ChildDialog *ui;//在namespace Ui下定义ChildDialog类指针ui

public slots://槽,可以被任何对象将信号与之相连
    void getTextFromFather(QString text);

};

#endif // CHILDDIALOG_H

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

Dialog::Dialog(QWidget *parent) ://构造函数定义
    QDialog(parent),
    ui(new Ui::Dialog)//ui指针指向新建的Dialog对象
{
    ui->setupUi(this);//ui调用指向的Dialog对象的子函数
    child = new ChildDialog(this);//child指向新建的ChildDialog对象(子窗口)
    connect(ui->lineEdit,SIGNAL(textChanged(QString)),child,SLOT(getTextFromFather(QString)));//将LineEdit发送的信号和child的槽连接
    child->show();//显示,继承自QWidget类
}

Dialog::~Dialog()//析构函数定义
{
    delete ui;
}

//childdialog.cpp
#include "childdialog.h"
#include "ui_childdialog.h"

ChildDialog::ChildDialog(QWidget *parent) ://构造函数定义
    QDialog(parent),
    ui(new Ui::ChildDialog)//ui指针指向新建的ChildDialog对象
{
    ui->setupUi(this);//ui调用指向对象的子函数
}

ChildDialog::~ChildDialog()//析构函数定义
{
    delete ui;
}

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

//main.cpp#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;//新建Dialog对象w(父窗口)
    w.show();//显示,继承自QWidget类

    return a.exec();

这个程序的作用是把主窗口中输入的字符同步到子窗口里,这里就需要用到槽,也就是在childdialog.h里定义的——

public slots://槽,可以被任何对象将信号与之相连

    void getTextFromFather(QString text);

那么槽是怎么用的呢?

void ChildDialog::getTextFromFather(QString text)//槽定义

{

    ui->lineEdit->setText(text);

}

槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。那么信号要怎么关联呢?需要用到connect函数——

connect(ui->lineEdit,SIGNAL(textChanged(QString)),child,SLOT(getTextFromFather(QString)));//LineEdit发送的信号和child的槽连接

connect函数的格式是:

bool QObject::connect ( const QObject * sender, const char * signal,

   const QObject * receiver, const char * member ) [static]

这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。

当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:

bool QObject::disconnect ( const QObject * sender, const char * signal,

   const Object * receiver, const char * member ) [static]

这个函数断开发射者中的信号与接收者中的槽函数之间的关联。

以上是对槽函数以及相关函数的介绍。但这个程序是有缺点的,如果你在子窗口里输入字符,父窗口里是不会同步的,因为它设计上是从父窗口同步到子窗口,而不是反过来。如果要两边一起同步,那么就需要再加一个slotconnect


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值