QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别
在QT5中,信号有参数和无参数
#ifndef SUBWIDGET_H
#define SUBWIDGET_H #include <QWidget>
#include <QPushButton> class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = ); void sendSlot(); signals:
/*信号必须有singles关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的生命,只需声明,无需定义
* 使用:emit mySignal();
*/
void mySignal(); void mySignal(int , QString); public slots: private:
QPushButton btn4;
}; #endif // SUBWIDGET_H
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{ this->setWindowTitle("波老师"); this->setFixedSize(,);
btn4.setParent(this);
btn4.setText("切换到苍老师"); //点击按钮btn4实现给主窗口发送信号
connect(&btn4,&QPushButton::clicked,this,&SubWidget::sendSlot); } void SubWidget::sendSlot()
{
emit mySignal();
emit mySignal(,"我是子窗口");
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h"//自子窗口头文件 class MainWidget : public QWidget
{
Q_OBJECT public:
MainWidget(QWidget *parent = );
~MainWidget(); void mySlot();//自定义的槽函数 void changeWin(); void dealWin(); void subSlot(int a,QString str);
private:
QPushButton btn1;
QPushButton *btn2;
QPushButton btn3;
SubWidget w;//该对象在主窗口中,子窗口没有办法调用,所以需要利用子窗口发送给主窗口消息,进而主窗口进行处理
}; #endif // MAINWIDGET_H
#include "mainwidget.h" #include <QPushButton> #include <QDebug>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{ // QPushButton btn1;
// QPushButton btn2; btn1.setParent(this);
btn1.setText("colse");
btn1.move(,); btn2 = new QPushButton(this);//指针没有空间,是需要动态的对其进行空间的分配
btn2 ->setParent(this);
btn2 ->setText(" 3 2 1 "); connect(&btn1,&QPushButton::pressed,this ,&MainWidget::close); /* 对connect的说明:
* &btn1 :信号发出着,指针类型
* &QPushButton::pressed:处理信号, &发送者的类名::信号名字
* this:信号接收者
* &MainWidget::close: 槽函数,信号处理函数 &接收者的类名::槽函数名字
*/ /*自定义槽,说的更加通俗一点,就是普通函数的用法
* QT5:可以是 任意的成员函数(常用这种方法,直接写成该类的成员函数),普通全局函数,静态函数 都可以是槽函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都是没有返回值,所以,槽函数一定没有返回值
*/
//释放按钮btn2实现里面的文本内容发生改变
connect(btn2,&QPushButton::released,this,&MainWidget::mySlot);//在写自定义信号槽函数的时候,一定要看发送信号函数的类型,这里released信号的函数是:void QAbstractButton::released()
//即released函数没有参数,也没有返回值,槽函数需要和信号一致,也没有参数和返回值 //释放按钮btn2隐藏按钮btn1
connect(btn2,&QPushButton::released,&btn1,&QPushButton::hide); //互相切换窗口的小游戏
this->setFixedSize(,);
this ->setWindowTitle("苍老师");
btn3.setParent(this);
btn3.setText("换到波老师");
btn3.move(,); //显示子窗口
// w.show(); //点击按钮btn3实现主窗口隐藏,子窗口显示
connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin); //处理子窗口发送过来的信号
void (SubWidget::*funSognal)() = &SubWidget::mySignal;
connect(&w,funSognal,this,&MainWidget::dealWin);
//处理子窗口发送过来的信号(有参数)
void (SubWidget::*testSognal)(int ,QString) = &SubWidget::mySignal;
connect(&w,testSognal,this,&MainWidget::subSlot);
} //自定义槽函数的实现
void MainWidget::mySlot()
{
btn2->setText("I LOVE YOU");
} void MainWidget::changeWin()
{
//子窗口显示,
w.show();
//本窗口隐藏
this ->hide(); }
void MainWidget::dealWin()
{
//子窗口隐藏
w.hide();
//本窗口显示
this->show();
} void MainWidget::subSlot(int a,QString str)
{
qDebug()<<a<<str;
}
MainWidget::~MainWidget()
{ }
当信号函数发生重载的时候,为了不产生二义性,需要使用函数指针的方式进行区分,(这里需要重点掌握指针函数的用法),同时从这种写法来看,也不难看出其在语法上还是比较难的,在QT4中则没用这么难,方式如下:
1)对槽函数声明public slots:
2)其最大的优势是当写connect中的SIGNAL和SLOT时会自动提示信号的类型,
既然QT4在这个方面那么简单简洁,为什么还要用QT5那么难的语法呢(函数指针)?这是因为在QT4中 SIGNAL 和SLOT 将函数名字转化成字符串 不进行错误的检查,只在运行的时候来提示程序不可行,在大的项目中,代码量是非常大的,我们还是尽量希望其能够提示语法的错误,不希望最后运行时提示有错误。
QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别的更多相关文章
- Ajax往后台传参数,无参数,一个参数,多个参数,一个对象等
原文:http://www.cnblogs.com/chenwolong/p/Get.html //无参数请求-简单示例 $(document).ready(function () { $.ajax( ...
- winform跨线程问题(有参数和无参数)
1.invoke是同步线程 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...
- python装饰器同时支持有参数和无参数的练习题
''' 预备知识: …… @decorator def f(*args,**kwargs): pass # 此处@decorator 等价于 f = decorator(f) @decorator2 ...
- oracle无参数和带参数的存储过程实例
SQL中调用存储过程语句:call procedure_name(); 注:调用时”()”是不可少的,无论是有参数还是无参数. 定义对数据库存储过程的调用时1.无参数存储过程:{call proced ...
- 为什么.Net要求序列化的类必须有一个无参数的构造函数
刚才用xml序列化器,序列化一个类,结果报错说序列化的类必须带有一个无参的构造函数,好奇怪啊.为什么要有这么苛刻的条件,而且xml序列化还要求序列化的成员是public. 我以前一直觉得序列化器是一个 ...
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- float([x]): 将一个字符串或数转换为浮点数。如果无参数将返回0.0
float([x]): 将一个字符串或数转换为浮点数.如果无参数将返回0.0 >>> float(12) 12.0 >>> float(-122) -122.0 & ...
- “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法
最近在项目中,使用EF编程时,在使用泛型类型的过程中,写了一上午,结果生成时,编译不通过,报出如下错误: “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法.如图: 找了好久,终 ...
- C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?
我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...
随机推荐
- USACO 5.4 tour的dp解法
题意:有n个点排成序列,两个人甲乙从1出发,到达n,中间的点不允许到达两次,只能从左向右走,问最多两人访问多少点. (膜大佬) 解: dp f(i, j) 表示甲到了i点,乙到了j点,两人最多访问了多 ...
- std::unique
类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值 ...
- View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views
Views Because view objects are the main way your application interacts with the user, they have many ...
- 数位dp真·浅谈 By cellur925
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...
- Ubuntu 设置文件默认打开的应用
右键单击该文件,然后点击属性,打开属性面板 然后进入open with的选项,选择应用后,点击 set as default
- java实现数据结构
数据结构与算法 :一.数据结构和算法简介 数据结构是指数据在计算机存储空间中的安排方式,而算法时值软件程序用来操作这些结构中的数据的过程.二. 数据结构和算法的重要性 几乎所有的程序都会使用到数据结构 ...
- 基于Tcp协议的上传下载
目录格式: 构建此目录就可随意使用! client端 import socket import sys import os import json import struct sk = socket. ...
- 洛谷 P2147 [SDOI2008]洞穴勘测
以下这个做法应该是叫线段树分治... 根据修改操作预处理出每条边存在的时间区间[l,r](以操作序号为时间),然后把所有形式化后的修改挂到线段树节点上. 处理完修改后,dfs一遍线段树,进入某个节点时 ...
- 牛客网NOIP赛前集训营-普及组
第一场: A-绩点 题目描述 小A刚考完大学考试.现在已经出了n门课的成绩,他想自己先算一下这些课的绩点是多少.设第i门课的他拿到的绩点是gpai,而这门课的学分是sci,那么他的总绩点用下面的公式计 ...
- ADB over Wi-Fi
ADB over Wi-Fi 1.root $adb root 2.设置tcp端口并重启tcpip服务 $adb shell setprop persist.adb.tcp.port &&am ...