之前碰到过很多信号槽的操作,比如:点击按钮触发什么函数,吧啦吧啦的

这种操作都是在界面上基于对应控件转到槽的方式实现的,如何用自定义的信号槽实现同样的功能?

//第一个参数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();
}


Qt中自定义信号槽          Qt中自定义信号槽



相关文章: