当前位置: 首页 > ai >正文

C++ for QWidget:自定义的信号和槽

使用mainwindow构建

Signal

在Qt中,信号(signals)是特殊的成员函数,它们用于对象间的通信,并且有一些特殊的规则:

  1. 没有返回值‌:信号不能有任何返回值。在您的例子中,void signalOne() 看起来是满足这个条件的,因为它没有返回值。但是,重要的是要注意信号的实现(即函数体)通常是不需要的,也是不允许的。信号的实现由Qt的元对象系统(通过MOC)自动处理。

  2. 不能有函数体‌:在Qt中,信号通常没有函数体。它们被声明为没有实现的函数原型,MOC工具会处理这些声明并生成必要的代码来连接信号和槽。然而,在您的代码片段中,signalOne() 有一个函数体 { qDebug("wanted"); },这是不允许的。

  3. 使用Q_OBJECT‌:包含信号的类必须继承自QObject(或其子类),并且必须在类的私有部分包含Q_OBJECT宏。这个宏为类启用了Qt的元对象系统,包括信号和槽的机制。 

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QPushButton>
#include<QApplication>
#include<QMessageBox>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include "wanted.h"
#include "foods.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;Foods *foods1;Wanted *wanted1;void emitSingal();//声明发射信号函数
};
#endif // MAINWINDOW_H
//mainwindoww.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);foods1 = new Foods(this);wanted1 = new Wanted();QObject::connect(wanted1, &Wanted::signalOne, foods1, &Foods::slotOne);//连接信号和槽函数emitSingal();//使用函数发射信号
}void MainWindow::emitSingal(){emit wanted1->signalOne();
}//发射信号函数的具体实现MainWindow::~MainWindow()
{delete ui;
}
//wanted.h
#ifndef WANTED_H
#define WANTED_H#include <QMainWindow>
#include <QObject>
#include <QWidget>class Wanted:public QObject
{Q_OBJECT
public:Wanted(QMainWindow *parent = nullptr);~Wanted();
signals:void signalOne();//声明了信号一
};#endif // WANTED_H

 

//wanted.cpp
#include "wanted.h"Wanted::Wanted(QMainWindow *parent) {}
Wanted::~Wanted()
{
}
//foods.h
#ifndef FOODS_H
#define FOODS_H#include <QMainWindow>
#include <QObject>
#include <QWidget>class Foods:public QObject
{Q_OBJECT
public:Foods(QMainWindow *parent = nullptr);~Foods();void slotOne();//定义了slotOne槽函数,在某些低版本Qt中,需要先声明public slots:
};#endif // FOODS_H
//foods.cpp
#include "foods.h"Foods::Foods(QMainWindow *parent) {
}//QMainWindow作为父类,而不是QWidgetFoods::~Foods()
{}
void Foods::slotOne(){qDebug("foods");
}//槽函数的具体实现

输出结果

http://www.xdnf.cn/news/7094.html

相关文章:

  • QML学习03(Component、Loader)
  • OpenHarmony SIM卡信号值整体流程分析
  • 本地部署代码托管解决方案 Gitea 并实现外部访问
  • 缓冲区的用途 和 fork复制进程
  • 深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
  • 内容中台智能推荐系统构建与演进
  • Python 装饰器详解
  • 提示工程 - 系统提示(System Prompts)
  • AI日报 - 2025年05月19日
  • Fine-Tuning Llama2 with LoRA
  • STC89C52单片机模拟实现洗衣机控制 Proteus仿真
  • TYUT-企业级开发教程-第一章
  • Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作
  • 如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误
  • C++:⾯向对象的三⼤特性
  • Java正则表达式:从基础到高级应用全解析
  • ColorAid —— 一个面向设计师的色盲模拟工具开发记
  • 超越想象:利用MetaGPT打造高效的AI协作环境
  • Vue 3 中使用 md-editor-v3 的完整实例markdown文本
  • Pandas 构建并评价聚类模型② 第六章
  • 实现菜谱二级联动导航
  • ubuntu防火墙命令和放行ssh端口
  • 03 Nginx日志格式及可视化
  • Estimation(估算):业务分析师的“不确定性对抗术”
  • LeetCode Hot100刷题——除自身以外数组的乘积
  • 【设计模式】- 行为型模式2
  • 时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?
  • 【Linux】第十八章 调优系统性能
  • 结构体对齐三大法则
  • UART、SPI、IIC复习总结