之前碰到过很多信号槽的操作,比如:点击按钮触发什么函数,吧啦吧啦的
这种操作都是在界面上基于对应控件转到槽的方式实现的,如何用自定义的信号槽实现同样的功能?
//第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,
//第二个参数信号,
//第三个参数this是槽方法所属类的对象,且必须在对象类的头文件的slots下定义
//第四个参数槽方法类,槽 方法
connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea()));
使用自定义的信号和槽,需要注意以下几点:
1、类的声明和实现分别放在.h和.cpp文件中;2、类声明中必须包含Q_OBJECT宏;
3、信号只要声明不要设计其的实现函数;
4、发射信号用emit关键字;
5、自定义槽的实现与普通成员函数的实现一样;
6、信号和槽方法必须在类的头文件中定义;
7、所有的槽函数必须声明在public slots语句内;
本文所示代码在windows 7 + MingW4.7版本中调试通过
QT系统为我们提供功能非常全面信号处理机制,它的内制信号和槽已经非常全面,因此大多数情况下,我们不需要自己设计信号和槽,但是有些时候,我们可能需要设计一些独特的信号和槽,来满足程序的需求。QT的核心机制信号和槽是独立于C++的,一般C++设计处理如按钮点击等方法,多采用回调函数,而回调函数设计上的复杂,虽然执行效率相对于QT信号与槽要高,但是其导制容易出错。况且在日常应用程序设计中来说,这种高效率相差不成比例,因此QT采用自己独门设计,来高效的编程。本文也同样倡导大家使用信号与槽。如何才能设计自己的信号和槽呢,阅读完本节您将会轻松实现自己的需求。
在创建信号和槽之前首先大家需要建立三个文件:类申明文件(mainwindow.h),类实现文件(mainwindow.cpp),程序主体文件(main.cpp)。实现点击主界面的按钮,变换文本框中的内容。
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT //Q_OBJECT是在定制信号和槽和必须包含的一条宏语句
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void slotest(); //所有的槽函数必须申明public slots语句内
private:
QPushButton *pb; //申请一个按钮QPushButton
QLineEdit *edit; //申请一个文本框QLineEdit
};
#endif // MAINWINDOW_H
mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setGeometry(90,90,300,300);
pb = new QPushButton("modifiy",this);
pb->setGeometry(10,10,100,20);
edit = new QLineEdit("what?",this);
edit->setGeometry(10,30,200,150);
QObject::connect(pb,SIGNAL(clicked()),this,SLOT(slotest()));//这个地方一定要写成this
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slotest()
{
edit->setText("want to eat");
}
main.cpp文件
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}