前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++在使用Qt中SLOT宏须要注意的一个小细节

C++在使用Qt中SLOT宏须要注意的一个小细节

作者头像
全栈程序员站长
发布于 2022-07-11 08:55:22
发布于 2022-07-11 08:55:22
1K00
代码可运行
举报
运行总次数:0
代码可运行

大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定。

但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是什么类型,就去运行哪个类型的函数。

非常有一种比較经典的使用方法,就是Template Method模式,基类定义一个非虚的算法框架,里面详细定义一些纯虚的函数片段,由子类来进行实现,从而实现了控制整体框架,但能够给客户自由定制的灵活性。这个使用方法事实上就是指针去调用了基类的方法,由方法的扩展之后扩展到虚函数的地方,指针继续使用了动态绑定特性进行查找虚函数表,通过理解为函数扩展,这样的理解似乎能够简单的多。

但在使用Qt的SLOT的时候,会出现一个问题须要注意,就是在connect的时候,你给当前的子类对象child设置了SLOT宏,但这个宏也在基类中实现过,举个样例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class Base : public QObject
{
Q_OBJECT
public:
   Base();
   void myConnect(QObject *other) { connect(other, SIGNAL(test()), this, SLOT(say())) }
privare slots:
   void say(){ qDebug() << "Base" };  
};

Class Child: public Base
{
Q_OBJECT
public:
   Child();
privare slots:
   void say(){ qDebug() << "Child" };  
};

在Base的myConnect中,this指针表示你在当前Base类中,这个时候非常自然的去调用Base::say(),一開始可能这样写为了自己主动连接和断除比較方便,可是假设你写了继承子类,你非常自然的去覆写了say这个函数,而且认为既然不是虚函数,没什么须要操心的,你可能会去用Child去连接别的对象,心理还在想着Base中say的实现方法(由于我记得我当初链接信号的时候写是在Base中写的,而且我如今没实用指针和引用,Child的say方法应该非常安全),但你会发现,最后触发的确实自己的slot,所以这点须要注意,比較微妙的一个小细节,尽管不是什么问题,但确实须要我们注意。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119038.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年11月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​在tinycolinux上安装sandstorm davros
本文关键字:git更新失败tlsv1,源码编译nodejs,提取sandstorm中的davros为免sandstorm版本
minlearn
2020/09/28
8330
通过nginx+uwsgi部署django应用在ubuntu
1.安装python3-pip -------------sudo apt-get install python3-pip 2.安装虚拟环境和虚拟环境管理包 sudo pip3 install virtualenv (报错的话需要把pip也安装一下) sudo pip3 virtualenvwrapper 在~/.bashrc 添加 export WORKON_HOME=~/Envs source /usr/local/bin/virtualenvwrapper.sh (如果没有virtualenvwrapper.sh就在这目录下创建这个文件) source .bashrc 创建虚拟环境:mkvirtualenv ShangOnline –p /usr/bin/python3 3.虚拟环境当中安装项目所依赖的包(mysqlclient会出一个问题,需要首先安装下面这个包) 我们可以通过 pip freeze > requirements.txt 将windows的虚拟环境安装包相应信息导出来移动到ubuntu pip3 install -r requirements.txt 在安装过程中mysqlclient会报错,按照下面两步走 sudo apt-get install libmysqlclient-dev pip install mysqlclient
用户2337871
2019/07/19
4930
Nginx+uwsgi部署Django应用
本文目的:在centos7.x服务器上利用nginx和uwsgi部署Django应用
Python中文社区
2018/07/26
1.5K0
Nginx配置管理平台
centos7 python2.7.6 etcd3.2.18 confd 0.16 nginx1.12.1
菲宇
2019/06/12
3.6K0
Nginx配置管理平台
​在tinycolinux上安装chrome
本文关键字:chrome as desktop shell,uniform web os for admin and user
minlearn
2020/09/28
2.7K0
Django 布署6.5
布署 从uwsgi、nginx、静态文件三个方面处理 服务器介绍 服务器:私有服务器、公有服务器 私有服务器:公司自己购买、自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环境,销售空间或主机,供其布署自己的应用 私有服务器成本高,需要专业人员维护,适合大公司使用 公有服务器适合初创公司使用,成本低 常用的公有服务器,如阿里云、青云等,可根据需要,按流量收费或按时间收费 此处的服务器是物理上的一台非常高、线路全、运行稳定的机器 服务器环境配置 在本地的虚拟环境中,项目根目录下,执行
Lansonli
2021/10/09
6030
Ubuntu 14.04下OpenERP安装定制过程实录
OpenERP作为目前优秀的开源ERP系统,功能非常强大,使用Python语言开发,基于模块化设计,使用、定制非常灵活。本文简要记录一下在Ubuntu 14.04 LTS x86_64安装、配置、使用OpenERP7.0的过程。
星哥玩云
2022/07/01
4580
​在tinycolinux上编译jupyter和rootcling组建混合cpp,python学习环境
本文关键字:升级/枚举tinycorelinux上的gcc,在tinycorelinux上安装python jupyter
minlearn
2020/09/28
8020
ubuntu Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了。比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署
py3study
2020/03/03
2.8K0
Python Web - Flask笔记10
编写uwsgi配置文件: 在项目的路径下面,创建一个文件叫做yingjoy_uwsgi.ini的文件,然后填写以下代码: [uwsgi] # Django相关的配置 # 必须全部为绝对路径 # 项目的路径 chdir = /srv/yingjoy # Django的wsgi文件 module = yingjoy.wsgi # Python虚拟环境的路径 home = /root/.virtualenvs/django-env-py2 # 进程相关的设置 # 主进程 master = true # 最大数量的工作进程 processes = 10 # socket文件路径,绝对路径 socket = /srv/yingjoy/yingjoy.sock # 设置socket的权限 chmod-socket = 666 # 退出的时候是否清理环境 vacuum = true 然后使用命令uwsgi --ini yingjoy.ini,看下是否还能启动这个项目。 安装nginx:
YingJoy_
2018/09/14
5590
Python Web - Flask笔记10
如何在CentOs 6.4 上使用uWSGI+Nginx部署Flask Web服务器
Armin Ronacher的Flask是过去几年中为Python创建的Web应用程序框架领域中发生过的最伟大的事情之一。
藕丝空间
2018/08/06
1.5K0
linux下搭建django记录笔记,未完稿,节后继续
阿里云ECS服务,有时需要更新apt-get,故先要先执行第一步 使用:SSH连接
学到老
2019/02/14
8120
CentOS + Python3.6+
用的系统是CentOS 6.4,其上python版本是2.6,而Django支持的版本是2.7+,又考虑到网页语言用UTF-8,而python3+默认字符已变为Unicode,所以选择python3版本,小菜理解,不知对错。
py3study
2020/01/06
1.6K0
CentOS + Python3.6+
在tinycolinux上编译seafile
本文关键字:tinycorelinux上从0源码编译seafile,uswgi方式配置运行seafile
minlearn
2020/09/28
9430
前后端分离项目一台服务器上线
一.购买服务器 这里有几点注意 选择配置 linux 系统的时候最好选择centos7+不要选择centos6+ 配置开发端口最好把常用端口打开以及运行端口最好多开几个防止后续nginx 启动网页没法没法访问ip一般是端口权限没开 默认服务器账户名为root 二.更新系统安装包(非常重要) yum update -y yum -y groupinstall "Development tools" yum install openssl-devel bzip2-devel expat-devel gdbm-
小小咸鱼YwY
2020/06/19
7620
Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
项目部署教程 在线教育平台项目演示地址 1.1.原理介绍 django  一个基于python的开源web框架 uwsgi  一是一个web服务器,也可以当做中间件 nginx 常用高性能代理服务器 wsgi.py django项目携带的一个wsgi接口文件 nginx Nginx是一个Http和反向代理服务器 什么是反向代理服务器呢? 正向的就是由浏览器主动的想代理服务器发出请求,经代理服务器做出处理后再转给目标服务器 反向的就是不管浏览器同不同意,请求都会经过代理服务器处理再发给目标服务器 这其中
zhang_derek
2018/04/24
1.4K0
Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
手把手教你在centos上配置Django项目(超详细步骤)
关于Django的部署,本人也踩了很多坑,这篇文章一步一步教你怎么进行部署,只需要你按照我的步骤来就OK了!这里我们使用的服务器是一个全新的服务器,没有安装任何东西。
Python进击者
2020/03/05
6.6K2
手把手教你在centos上配置Django项目(超详细步骤)
centos7 下通过nginx+uwsgi部署django应用
这里需要注意 一定是直接用nginx命令启动, 不要用systemctl启动nginx不然会有权限问题
零式的天空
2022/03/25
6430
Install Django Nginx uWSGI
概述 最近项目需要安装和配置多站点环境,所以把多站点开发环境配置和安装记录下来,帮助其他人少走坑。 安装Python 2.7.x 首先安装一些开发环境基本的包和类库, yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel 安装完成之后,我们接下来安装Python。我在
吕海峰
2018/04/03
9300
在CentOS 7上部署Odoo 12
安装CENTOS7.3后我们将从软件集合(SCL)信息库安装Python 3.6软件包。
好派笔记
2021/09/15
2.1K0
相关推荐
​在tinycolinux上安装sandstorm davros
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验