4自定义信号和槽函数

自定义信号和槽

信号和槽的本质都是函数。

区别:

信号必须由signal关键字来声明

信号可以重载

信号没有返回值,但可以有参数。由于信号都是没有返回值,所以,槽函数一定没有返回值

信号就是函数的声明,只需声明,无需定义。槽既要函数声明也要完成定义。

使用方式:emit MySignal();

例子说明:本例创建两个独立的窗口,分别在窗口中放置一个按钮,由此来进行两个窗口的切换。如:“切换到子窗口”,即子窗口显示,主窗口隐藏。反之亦然。

按照之前的方式创建程序,另外在项目中“添加新文件”->“C++ class”,名为csubwnd。即创建两个类,作为主窗口(widget)和子窗口(csubwnd)。

思路:

创建两个类,主窗口类来处理窗口的切换,本来只显示窗口,当收到子窗口发出的信号后,立即显示子窗口并隐藏主窗口。而子窗口类只负责发出信号。

自定义信号

一定要在Signal中声明(头文件中)。

signals:

void MySignal();

使用方式:

connect(&subPush,&QPushButton::released,this,&CSubWnd::MySlot);

void CSubWnd::MySlot()

{

emit MySignal();

}

其中MySlot()是自定义槽函数(具体见上一节内容)。emit MySignal()代表发出信号。

解析:当按钮subPush被释放时,this(本窗口)立即调用槽函数(MySlot)发出信号(MySignal)。由此可以看到,信号只需声明无需定义,槽函数既要声明也要定义。

主窗口的信号处理:

void Widget::Base()

{

//主窗口隐藏

this->hide();

//子窗口显示

subWnd.show();

}

void Widget::Sub()

{

//主窗口显示

this->show();

//子窗口隐藏

subWnd.hide();

}

{

//激活槽函数,切换到子窗口

connect(&push,&QPushButton::released,this,&Widget::Base);

//接受子窗口的信号,切换到主窗口

connect(&subWnd,&CSubWnd::MySignal,this,&Widget::Sub);

}

其中,push代表“切换到子窗口”按钮,subWnd代表“切换到主窗口”的按钮,MySignal是子窗口发出的信号。Base和Sub是两个用于切换窗口的槽函数。

带参数的信号

前面说过信号啊可以重载,下面重载一个带参数的信号。

信号声明:

signals:

//自拟信号

void MySignal();

void MySignal(int ,QString);

调用信号:

void CSubWnd::MySlot()

{

//发出自拟信号

emit MySignal();

emit MySignal(2018,"I am learnning Qt,我学习QT");

}

槽函数定义:

void Widget::TextSignal(int nNum,QString strChar)

{

qDebug()<<nNum<<strChar;

}

注意:信号和槽函数的参数必须一致,如信号void MySignal(int ,QString),即槽函数TextSignal也必须两个参数,且为类型为int和Qstring。

补充:

qDebug()是输出函数,类似于C++中的cout。qDebug()的头文件是<QDebug>,但使用时要注意qDebug(),q是小写,并且带上括号。

信号与槽函数的使用:

//Qt5版本带参数的信号

void (CSubWnd::*NoSub)()=&CSubWnd::MySignal;

connect(&subWnd,NoSub,this,&Widget::Sub);

void (CSubWnd::*Sub)(int,QString)=&CSubWnd::MySignal;

connect(&subWnd,Sub,this,&Widget::TextSignal);

问题:为什么要使用函数指针,而不是直接信号本身,如下:

connect(&subWnd, &CSubWnd::MySignal,this,&Widget::Sub);

connect(&subWnd, &CSubWnd::MySignal,this,&Widget:: TextSignal);

原因:

在前面的信号声明。   void MySignal();void MySignal(int ,QString);使用的是重载,如果直接信号名,会产生二义性,编译器无法获取发出的信号是哪一个?带参数还是不带参数。

当然,也有一种简便方式.

//Qt4版本,与Qt5使用函数指针效果等价

connect(&subWnd,SIGNAL(MySignal()),this,SLOT(Sub()));

connect(&subWnd,SIGNAL(MySignal(int,QString)),this,SLOT(TextSignal(int,QString)));

注意:如果使用Qt4版本。SINAL,SLOT都是宏。

  1. SINAL,SLOT将函数名字转换成字符串,不进行错误检查,如:SIGNAL(MySigl()),拼写错误了,编译器也会通过,但是会在执行的过程中才中断报错。
  2. 槽函数必须使用slots关键字来声明,否则无法识别,会报出无法寻查该函数。

public slots:

void Base();         //切换到子窗口

void Sub();          //切换到主窗口

void TextSignal(int ,QString);        //测试带参数信号

补充:输出编码问题

qDebug()<<nNum<<strChar;

当string=“我学习QT",可能会输出\u6211\u662F\u5B32\u3291.二进制编码

解决方法:

qDebug()<<nNum<<strChar.toUtf8().data();

解析

strChar.toUtf8()->字节数组QbyteArray

…data()->QbyteArray->char*.

此时就可以输出中文了。也可以是其他类型的编码。可以在qt编译器->工具->选项->文本编辑器.可以查看当前自己的编码类型。

源代码:

csubwnd.h

#ifndef CSUBWND_H

#define CSUBWND_H

#include <QWidget>

#include <QPushButton>

class CSubWnd : public QWidget

{

Q_OBJECT

public:

explicit CSubWnd(QWidget *parent = 0);

//发出信号的槽函数

void MySlot();

signals:

//自拟信号

void MySignal();

void MySignal(int ,QString);

public slots:

private:

//按钮

QPushButton subPush;

};

#endif // CSUBWND_H

widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QPushButton>

#include "csubwnd.h"

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

public slots:

void Base();         //切换到子窗口

void Sub();          //切换到主窗口

void TextSignal(int ,QString);        //测试带参数信号

private:

Ui::Widget *ui;

QPushButton push;

//子窗口类

CSubWnd subWnd;

};

#endif // WIDGET_H

csubwnd.cpp

#include "csubwnd.h"

CSubWnd::CSubWnd(QWidget *parent) :

QWidget(parent)

{

this->setWindowTitle("子窗口");

subPush.setParent(this);

subPush.setText("切换到主窗口");

this->show();

//点击按钮后,利用槽函数发出信号

connect(&subPush,&QPushButton::released,this,&CSubWnd::MySlot);

resize(400,300);

}

void CSubWnd::MySlot()

{

//发出自拟信号

emit MySignal();

emit MySignal(2018,"I am learnning Qt,我学习QT");

}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Widget w;

w.show();

return a.exec();

}

widget.cpp

#include "widget.h"

#include "ui_widget.h"

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

this->setWindowTitle("主窗口");

push.setText("切换到子窗口");

push.setParent(this);

//激活槽函数,切换到子窗口

connect(&push,&QPushButton::released,this,&Widget::Base);

//接受子窗口的信号,切换到主窗口

// connect(&subWnd,&CSubWnd::MySignal,this,&Widget::Sub);

//Qt5版本带参数的信号

//void (CSubWnd::*NoSub)()=&CSubWnd::MySignal;

//connect(&subWnd,NoSub,this,&Widget::Sub);

//void (CSubWnd::*Sub)(int,QString)=&CSubWnd::MySignal;

//connect(&subWnd,Sub,this,&Widget::TextSignal);

//Qt4版本,与Qt5使用函数指针效果等价

connect(&subWnd,SIGNAL(MySignal()),this,SLOT(Sub())); connect(&subWnd,SIGNAL(MySignal(int,QString)),this,SLOT(TextSignal(int,QString)));

//设置窗口大小

resize(400,300);

}

Widget::~Widget()

{

delete ui;

}

void Widget::Base()

{

//主窗口隐藏

this->hide();

//子窗口显示

subWnd.show();

}

void Widget::Sub()

{

//主窗口显示

this->show();

//子窗口隐藏

subWnd.hide();

}

void Widget::TextSignal(int nNum,QString strChar)

{

qDebug()<<nNum<<strChar.toUtf8().data();

}

原文地址:https://www.cnblogs.com/gd-luojialin/p/9215696.html

时间: 2024-10-09 08:06:48

4自定义信号和槽函数的相关文章

如何在VS2013+QT5.3环境下使用自定义信号与槽函数

图1中标注出来的是VS2013中的QT界面设计师文件,双击默认打开的是Qt设计师工具. 在界面上面拉入一个PushButton,点击编辑信号与槽按钮进入编辑模式. 选择信号clicked(),发现可以从QWidget继承很多槽函数,暂时先选择close()槽函数,点OK 保存后,VS2013中有个文件“ui_testqt.h”会自动生成信号与槽的代码.此文件也是生成界面文件的源代码. 目前都是使用的默认的信号与槽函数,如果想触发自定义的槽函数呢?我们会想到可以直接修改ui_testqt.h里面的

qt自定义信号和槽函数 emit

一.自定义信号 关键字:signals signals  : void ageChanged(int age); //虽然是一个函数,但是无需实现,参数age会传递到槽函数 二.信号和槽函数的关联 connect(boy,&Person::ageChanged,this,&Person::on_ageChanged); 三.发射信号 关键字:emit emit ageChanged(age);  //当年龄age改变时发射信号,让执行槽函数 四.槽函数 void Person::on_ag

【PyQt5-Qt Designer】pyqtSignal()-高级自定义信号与槽

PyQt 5信号与槽的几种高级玩法 参考:http://www.broadview.com.cn/article/824 from PyQt5.QtCore import QObject , pyqtSignal class CustSignal(QObject): #声明无参数的信号 signal1 = pyqtSignal() #声明带一个int类型参数的信号 signal2 = pyqtSignal(int) #声明带int和str类型参数的信号 signal3 = pyqtSignal(

QT自定义信号和槽

最近项目中使用到QT,在此记录一下QT的核心,信号与槽: QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) sender:信号发出者 signal:发送信号 receiver:信号接收者 method:信号处理者 新建一个QT窗口,在窗口上放一个按

Qt中的信号和槽函数。

1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口. 1 #include "slot.h" 2 #include <QApplication> 3 #include<QPushButton> 4 #include<time.h> 5 #ifndef SLOT_H 6 #define SLOT_H 7 #include <QMainWindow> 8 #include <QObject> 9 #include &l

第五篇 -- 为组件的内建信号编写槽函数

学习书籍<Python Qt GUI与数据可视化编程> 上一节学习的是内部自带的槽函数,这一节学习自己为组件编写槽函数. 回忆一下上一节的图 我们把确定按钮绑定了accept()函数,把退出按钮绑定了close()函数.接下来,我们来看一下清空按钮. 清空: 首先在__init__()里将其绑定一个函数 self.ui.btnClear.clicked.connect(self.clear_text) 其次在myDialog类中编写clear_text()函数 def clear_text(s

自定义信号与槽

引自:<PyQt5官网Doc:Support for Signals and Slots><Qt5官网: Signals & Slots> Qt 对于大部分widget的常规操作,都预定义了一系列的 connect(),例如你按下一个按钮,至于动作的实现,只需要重写 On_Click_Button() 就能实现.这个过程就包括了内在的信号-槽连接.而这些关联动作已经在基类中配置好了,故而你不需要指定connect也可以实现动作. 但如果我们需要自定义一些信号和槽的连接动作呢

QT中信号与槽的常见使用

一.标准信号与槽函数 有些信号和槽的函数模板都已经被写好了,只需要调用即可 下面是一个点击按钮关闭窗口的程序 .h文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信号与槽的时候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyW

VS2008 Qt Designer 中自定义信号槽

一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7  中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigner功能齐全,只能Editor已有的信号槽. 发现:在QtCreator中右击某个控件 有"转到槽"功能,就会在.h和.cpp文件中生成我们的自定义槽函数void on_openButton_clicked() 解决方法:在VS2008中,选择某个项目,选择菜单Qt/Creat basic