参考:点击打开链接
有时候我们需要在两个或者多个窗口之间同步信息,这时候我们就需要用到槽。请看下面的程序:(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]
这个函数断开发射者中的信号与接收者中的槽函数之间的关联。
以上是对槽函数以及相关函数的介绍。但这个程序是有缺点的,如果你在子窗口里输入字符,父窗口里是不会同步的,因为它设计上是从父窗口同步到子窗口,而不是反过来。如果要两边一起同步,那么就需要再加一个slot和connect。