Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆栈对象QT信号和参数作为参考?

可以使用以下代码吗?

代码语言:txt
AI代码解释
复制
class Test : public QObject
{
    Q_OBJECT

signals:
    void myQtSignal(const FooObject& obj);

public:
    void sendSignal(const FooObject& fooStackObject)
    {
        emit  myQtSignal(fooStackObject);
    }
};

void f()
{
    FooObject fooStackObject;
    Test t;
    t.sendSignal(fooStackObject);
}

int main()
{
    f();
    std::cin.ignore();
    return 0;
}

回答 2

逆鳞若光

发布于 2018-01-29 01:48:00

由于信号/插槽连接的工作方式,传递Qt信号的参考并不危险:

  • 如果连接是直接的,则直接直接调用连接的插槽,例如,emit MySignal(my_string)直接返回所有直接连接的插槽。
  • 如果连接,Qt创建一个引用的副本。所以当这个插槽被调用的时候,它有自己的引用传递的变量的有效副本。但是这意味着参数必须是Qt知道的类型才能复制。

http://qt-project.org/doc/qt-5.1/qtcore/qt.html#ConnectionType-enum

微信资讯小编

发布于 2018-01-29 01:19:45

可以看下这个测试:

代码语言:txt
AI代码解释
复制
#include <iostream>
#include <QCoreApplication>
#include <QDebug>
#include <QTimer>

class Param {
public:
    Param () {}
    Param (Param const &) {
        std::cout << "Calling Copy Constructor\n";
    }
};

class Test : public QObject {
    Q_OBJECT

public:
    Test () {
        for (int index = 0; index < 3; index++)
            connect(this, &Test::transmit, this, &Test::receive,
                Qt::QueuedConnection);
    }

    void run() {
        Param p;
        std::cout << "transmitting with " << &p << " as parameter\n";
        emit transmit(p);
        QTimer::singleShot(200, qApp, &QCoreApplication::quit);
    }

signals:
    void transmit(Param const & p);
public slots:
    void receive(Param const & p) {
        std::cout << "receive called with " << &p << " as parameter\n";
    }
};

还有

代码语言:txt
AI代码解释
复制
#include <QCoreApplication>
#include <QTimer>

#include "param.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // name "Param" must match type name for references to work (?)
    qRegisterMetaType<Param>("Param"); 

    Test t;

    QTimer::singleShot(200, qApp, QCoreApplication::quit);
    return a.exec();
}

运行

代码语言:txt
AI代码解释
复制
Calling Copy Constructor
Calling Copy Constructor
Calling Copy Constructor
receive called with 0x1bbf7c0 as parameter
receive called with 0x1bbf8a0 as parameter
receive called with 0x1bbfa00 as parameter

尝试下这个

代码语言:txt
AI代码解释
复制
transmitting with 0x7ffebf241147 as parameter
receive called with 0x7ffebf241147 as parameter
receive called with 0x7ffebf241147 as parameter
receive called with 0x7ffebf241147 as parameter

如果转到按值传递

代码语言:txt
AI代码解释
复制
Calling Copy Constructor
Calling Copy Constructor
Calling Copy Constructor
Calling Copy Constructor
Calling Copy Constructor
receive called with 0x7fff15146ecf as parameter
Calling Copy Constructor
receive called with 0x7fff15146ecf as parameter
Calling Copy Constructor
receive called with 0x7fff15146ecf as parameter
和开发者交流更多问题细节吧,去 写回答
相关文章
Qt学习笔记 信号和槽
槽和普通c++成员函数一样只可以为虚函数,也可以被重用,可以是公有的也可以是私有的,也可以被其它的c++函数调用; 参数也是任意的 唯一不同的是本槽和信号是可以连在一起的,和c#的事件差不多。相连后每当发射这个信号后就会自动调用这个槽 connection(sender,SIGNAL(signal),receiver,SLOT(slot)); sender就发送信号的Qobject指针 receiver是槽的Qobject指针 signal和slot是只有形参的函数名。SIGNAL和SLOT宏会把它们的参数
lpxxn
2018/01/31
7120
Qt 信号和槽机制详解
信号和槽是 Qt 独有的一种机制,他让窗口的各种消息处理简化到极致,常规情况下我们相应某窗口(控件)的点击时都需要自己投递消息到框架中,由框架的消息队列投递给不同的窗口消息处理函数来处理。如果使用信号和槽,需要声明信号、定义槽函数、绑定信号和槽、发射信号就可以完成上述功能,代码简单容易理解,逻辑简单易懂。信号和槽的大致实现图如下:
我与梦想有个约会
2023/10/20
1.1K0
Qt 信号和槽机制详解
JS处理函数将对象作为参数传递
做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天简单的说有一下:
何处锦绣不灰堆
2020/05/29
8.3K0
Qt信号和槽入门介绍和使用
通过上图可得:Qt中通过connect函数来进行连接,从而触发一个事件 代码演示前,我们需要之前信号这个东西在帮助文档里面怎么找到,首先我们这里是创建一个按钮控件。实现点击按钮,关闭窗口,那么就应该去父类QPushButton类中找signal信号函数:
大忽悠爱学习
2021/11/15
5970
QML知识-使用Qt信号和方法
在实际中开发QML应用,会经常用到信号这一属性。像onClicked,onDoubleClicked是异步操作,它们多由信号触发完成。有时候需要与Qt/C++进行数据通信时候,使用Qt的信号机制往往可以提高编程效率的效果。
Qt君
2019/07/16
2K0
Qt自定义信号和槽
案例需求: 创建一个老师类和学生类,下课后,老师触发饿了的信号,学生响应老师饿了的信号,并且请老师吃饭 老师类 .h
大忽悠爱学习
2021/11/15
4090
Qt Inside信号和槽之connect
上次和大家分享的是Qt信号和槽的一些宏定义以及元对象编译器。这次和大家分享信号和槽的connect函数到底连接了什么、还有元对象编译器都生成了什么代码。
用户5908113
2020/03/23
6240
Qt 注册自定义数据类型提供信号和槽函数传递参数
Qt 信号和槽函数参数只能是基于 Qt 的基础类型的,比如 QString、int、bool 等,如果想传递自定义类型默认情况下是行不通的。要想在 Qt 的信号和槽函数之间传递自定义类型,可以先将自己的自定义类型注册一下,使用如下代码:
我与梦想有个约会
2023/10/21
7800
Qt 注册自定义数据类型提供信号和槽函数传递参数
Qt 信号和槽函数参数只能是基于 Qt 的基础类型的,比如 QString、int、bool 等,如果想传递自定义类型默认情况下是行不通的。要想在 Qt 的信号和槽函数之间传递自定义类型,可以先将自己的自定义类型注册一下,使用如下代码:
我与梦想有个约会
2018/12/18
6K0
02 qt基本控件及信号和槽
将string -----> QString [static] QString QString::fromStdString(const std::string &str) – 静态成员函数,可以直接使用类名调用 比如:
天天Lotay
2023/10/15
4130
02 qt基本控件及信号和槽
C++对象模型_Class Obj作为函数参数
开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。 对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然
chinchao.xyz
2022/04/25
1.4K0
C++对象模型_Class Obj作为函数参数
QT信号槽机制
信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制。在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应。例如:
Tencent JCoder
2022/05/06
9970
QT信号槽机制
QT信号槽机制[Qt槽判断信号来源]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说QT信号槽机制[Qt槽判断信号来源],希望能够帮助大家进步!!!
Java架构师必看
2022/03/09
2K0
QT信号槽机制[Qt槽判断信号来源]
QT学习之路--信号和槽的认识
信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽 是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准 的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
Vaccae
2019/07/24
6910
Qt初识信号槽
信号就是发生的事件,槽就是处理事件的函数。这两者不在一起,不像MFC的消息循环机制。它们是松散的耦合。要想将它们连接起来,那么必须使用connect函数来连接它们。例如,当我想实现,点击关闭按钮就会关闭当前窗口的操作。那么我就需要使用connect函数来连接“点击”这个信号函数和“关闭”这个槽函数。
zy010101
2020/04/08
9130
【QT】QT对象树
每个继承自QObject类的对象通过它的对象链表(QObjectList)来管理子类对象,当用户创建一个子对象时,其对象链表相应更新子类对象的信息,对象链表可通过children()获取。
半生瓜的blog
2023/05/13
1.5K0
【QT】QT对象树
运算符重载使用它类对象作为参数
我们想实现一个功能,分别有两个类,一个名为 Sender,负责发送邮件。另外一个类名为 Mail,负责管理发送的标题和内容。在使用的时候,我们需要让类 Sender 重载 << 操作符,以实现将 Mail 类的数据发送出去,大致用法就是 Sender << Mail 这样的方式。这就涉及到了诸多问题。
我与梦想有个约会
2023/10/20
3740
Qt信号记录器
  QSignalSpy可以连接到任何对象的任何信号并记录其发射信息。QSignalSpy本身是一个QVariant列表的列表QList<QList<QVariant> >。信号的每次发射都将向列表中追加一个项,其中包含信号的参数列表。
Qt君
2020/05/08
1K0
Qt中的信号槽
类似于一些其它的编程语言或框架中的回调机制,信号槽是Qt基于C++语法新增的特性,使用起来非常方便,可以完成不同对象之间的通信。
软件架构师Michael
2023/09/20
5670
【QT】QT元对象系统
元对象系统是一个基于标准C++的扩展,为QT提供了信号与槽机制、实时类型信息、动态属性系统。
半生瓜的blog
2023/05/13
1.3K0
【QT】QT元对象系统

相似问题

请问有没有Thinkphp实现对象存储和上传下载的DEMO,参考一下?

1571

云直播中HLS为什么不能作为播放人数进行参考啊?

1171

使用C#作为参数传递方法?

2304

41.对于模拟视频信号,以下说法正确的是(41)。 A.分量视频信号中亮度信号和色差信号是分开独立传输的?

018

腾讯云开发培训和考试题参考,能否提供?

0396
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
相关问答用户
公司公司公司公司公司公司 | 职务职务职务职务职务职务擅长3个领域
腾讯云TDP | 高级后端开发工程师擅长3个领域
东方航空 | 项目经理擅长1个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档