前面简单讲述了qt的信号与槽机制和如何建立信号与槽的两种方法,但是前面所使用的信号是qt本身已经编写好的,今天我们来学习如何使用自己编写的信号函数(信号与槽本身就是函数,前面已经讲过)并且发送字符串信息。
首先,是这次用到的代码:
#ifndef CHILDDIALOG_H
#define CHILDDIALOG_H
#include
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
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
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信号不需要发送。同时,在发送信号的时候传递了字符串信息。