QT学习 --自定义的信号与槽发生重载的解决

2023-11-14

当自定义的信号与槽发生重载时,应该怎样处理呢?

首先,要定义一个函数指针。其次,我们在声明一个成员函数的函数地址时,要把成员函数的作用域也放到指针的前面。

在 student.h 中

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:

public slots:
    //早期的Qt版本 自定义槽函数必须写到public slots下
    //高级的Qt版本 自定义槽函数可以写到public slots、public下或全局作用域下
    //返回值 void ,需要声明,也需要实现
    //可以有参数,也可以发生重载
    void run();

    void run(QString type);

};

#endif // STUDENT_H

在 teacher.h 中

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定义信号 写到signals下
    //返回值是void,只需要声明,不需要实现
    //可以有参数,可以重载
    void classoff();

    void classoff(QString type);
};

#endif // TEACHER_H

在 student.cpp 中

#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{

}
void Student ::run()
{
    qDebug()<<"抢饭第一名";
}

void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type;
}

在 teacher.cpp 中,因为信号只需声明,而不用实现。

#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent)
{

}

在 mywidget.cpp 中

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)//这个在C++语法中被称为初始化列表
{
    //创建一个老师的对象
    this ->wu =new Teacher(this);
    //创建一个学生的对象
    this ->ming =new Student(this);

    //下课铃响了(相当于是按键的点击事件),老师(信号的发送者)说下课(信号),小明(信号的接收者)往外跑(槽函数)。
    //指针可以指向地址,现在要指向&Teacher::classoff(是一个函数的地址)
    //因此要定义一个函数指针
    //我们在声明一个成员函数的函数地址时,要把成员函数的作用域也放到指针的前面
    void (Teacher:: *teacherSignal)(QString)=&Teacher::classoff;

    //同理,槽函数也要进行修改
    void (Student:: *studentSlot)(QString)=&Student::run;

    //要先做好连接
    connect(wu,teacherSignal,ming,studentSlot);
    ring();
}

//下课铃响函数,该函数运行后,将触发老师说下课(信号),小明向外跑(槽函数)
void myWidget:: ring()
{
    //释放老师说下课(信号)
    //emit wu->classoff();
    emit wu->classoff("放假");
}

当程序运行后,
在这里插入图片描述
这里需要注意:

1、要先建立连接,再有发生事件。

2、当发生事件后,发送者发送信号,接收者接收到信号后,执行槽函数。

3、需要注意的是槽函数需要与信号一致(参数,返回值)。也就是说如果信号没有返回值,那么槽函数一定没有返回值。如果槽函数有参数,那么信号一定也有参数。因为槽函数中的参数是用来接收信号所带的参数的。

还要注意这里的发生事件( ring函数 )打印出来的是有双引号的。
在这里插入图片描述
为什么会是这样呢?

这是因为

自定义信号中的参数是 QString 类型的

void classoff(QString type);
void myWidget:: ring()
{
    emit wu->classoff("放假");
}

相应的槽函数要遵循与信号一致(参数,返回值)的原则,所以参数也要定义为 QString 类型,正是因为 QString 类型的原因,所以才会有引号。

void run(QString type);
void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type;
}

如果我不想加这个引号,应该怎么做呢?
要进行格式转换。转换成 char * 类型就不加引号了。
那怎么转换呢?
首先,要明确它不是直接就可以转换的。

而是要先转换成 QByteArray (利用 toUtf8 这个方法)之后,再转化成 char * 类型的。
在这里插入图片描述
在QByteArray 这个类中提供了很多方法,我们的目标是转换为char *
在这里插入图片描述
这里就寻找返回值是 char * 的函数。
在这里插入图片描述

void Student ::run(QString type)
{
    qDebug()<<"抢饭第一名"<<type.toUtf8().data();
}

我们再来运行下程序。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT学习 --自定义的信号与槽发生重载的解决 的相关文章

  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • 如何向同一个 QMenu 添加多个 QAction?

    我正在尝试实现 Qt 菜单自定义 并且我提供了一个功能来添加相同的功能QAction在同一个人民币上下文菜单中多次 但是当我尝试这样做时 myMenu gt addAction myAction myMenu gt addAction my
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望

随机推荐