首页 > 其他分享 >Qt 自动连接机制信号与槽

Qt 自动连接机制信号与槽

时间:2024-09-08 22:37:17浏览次数:9  
标签:Qt QAction 连接 自动 action WindowB WindowA include MainWindow

概述

Qt 提供了自动连接机制,可以根据特定的命名规则自动将信号与槽连接。这种机制简化了信号与槽的连接工作,无需显式地调用 QObject::connect

命名规则

自动连接机制依赖于特定的槽函数命名规则。槽函数名称的格式为:

on_<objectName>_<signalName>
  • objectName:是发射信号的对象的名称。
  • signalName:是信号的名称(例如 clickedtriggered 等)。

设置对象名称

在使用自动连接机制之前,需要为信号发射对象设置对象名称。可以通过 setObjectName 方法实现:

QAction *actionOpenA = new QAction("Open Window A", this);
actionOpenA->setObjectName("action_WindowA");

示例

假设有一个 MainWindow 类和两个窗口类 WindowAWindowB,并希望通过菜单项来弹出这两个窗口。

1. 定义槽函数

MainWindow 类中定义槽函数,按照自动连接的命名规则:

// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class WindowA;
class WindowB;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void on_action_WindowA_triggered();
    void on_action_WindowB_triggered();

private:
    WindowA *windowA;
    WindowB *windowB;
};

#endif // MAINWINDOW_H

2. 实现槽函数

MainWindow 类的实现文件中,实现这些槽函数:

// MainWindow.cpp
#include "MainWindow.h"
#include "WindowA.h"
#include "WindowB.h"
#include <QMenuBar>
#include <QAction>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), windowA(nullptr), windowB(nullptr)
{
    QMenu *fileMenu = menuBar()->addMenu("File");

    QAction *actionOpenA = new QAction("Open Window A", this);
    QAction *actionOpenB = new QAction("Open Window B", this);

    // 设置对象名称以匹配槽函数的命名规则
    actionOpenA->setObjectName("action_WindowA");
    actionOpenB->setObjectName("action_WindowB");

    fileMenu->addAction(actionOpenA);
    fileMenu->addAction(actionOpenB);
}

void MainWindow::on_action_WindowA_triggered()
{
    if (!windowA) {
        windowA = new WindowA(this);
    }
    windowA->show();
}

void MainWindow::on_action_WindowB_triggered()
{
    if (!windowB) {
        windowB = new WindowB(this);
    }
    windowB->show();
}

3. 主函数

// main.cpp
#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow w;
    w.show();

    return app.exec();
}

注意事项

  • 对象名称唯一性:确保为每个 QAction 设置唯一的对象名称,以避免命名冲突。
  • 槽函数命名:槽函数的命名必须符合 on_<objectName>_<signalName> 的规则,否则 Qt 不会自动连接信号和槽。

总结

Qt 的自动连接机制通过规范的命名规则自动连接信号和槽,减少了手动连接的代码量。只需设置正确的对象名称,并确保槽函数的命名符合规则即可。

标签:Qt,QAction,连接,自动,action,WindowB,WindowA,include,MainWindow
From: https://www.cnblogs.com/echohye/p/18403633

相关文章

  • 每天五分钟玩转深度学习框架PyTorch:将nn的神经网络层连接起来
    本文重点前面我们学习pytorch中已经封装好的神经网络层,有全连接层,激活层,卷积层等等,我们可以直接使用。如代码所示我们直接使用了两个nn.Linear(),这两个linear之间并没有组合在一起,所以forward的之后,分别调用了,在实际使用中我们常常将几个神经层组合在一起,这样不仅操作方便,而且......
  • Codesys与Factory IO实现连接的方法
    Codesys在运动控制领域有着广泛应用,FactoryIO可以做出漂亮的3D仿真界面,两个结合起来就可以做出接近实际设备的效果。下边介绍实现Codesys与FactoryIO连接的方法。主要思路是使用FactoryIO做ModbusTCP/IPServer。Codesys设备做Modbus_TCP_Slave。二者通过SoftwareLoopback......
  • 甘特图-自动计算项目进度
    实时监控任务进度一直是项目管理中的一项巨大挑战。人工统计方式不仅耗时耗力,而且往往由于信息传递的延迟和人为误差,导致项目管理者无法实时获得准确的项目进展信息。这种不准确性可能掩盖潜在的风险点,从而影响项目的整体进度和成果。甘特图工具(Ganttable)提供了三种任务进度......
  • 自动驾驶-多传感器融合
    之前在实习,写一点自动驾驶感知方向的知识点目录融合感知目的根据融合的阶段和机制,传感器融合可以分为不同类型:不同融合方法对比1.前融合(数据级融合)2.后融合(目标级融合)3.集中式融合4.分布式融合综合对比根据融合层次的不同可以分为1.数据级融合(低级融合)2.特征......
  • 关于 node-cron 自动化
    npminstall--savenode-croncron.schedule('******',()=>{console.log('runningataskeveryminute');});  ******┬┬┬┬┬┬│││││││││││└星期几(0-7)(0相对于周日)│......
  • Jenkins+Github+Nginx实现前端项目自动部署
    前言最近在搭建一个自己的网站,网站框架搭好了要把项目放到服务器运行,但是每次更新网站内容就要手动部署一次,实在很麻烦,于是就想搭建一套自动化部署的服务。看了一些案例最后选用现在比较主流的Jenkins+Github+Nginx的方案来搭建,于是跟着教程去做,看了很多教程其实不是太......
  • 【Qt】窗口移动和大小改变事件
     窗口移动和大小改变事件moveEvent窗口移动时触发的事件resizeEvent窗口大小改变时触发的事件例子:测试移动窗口和改变窗口事件 代码展示#include"widget.h"#include"ui_widget.h"#include<QDebug>#include<QMoveEvent>#include<QResizeEvent>Widget::Wi......
  • 影刀RPA实战:自动化批量生成条形码完整指南
    今天我们聊聊使用影刀来实现批量生成条形码,条形码在零售行业运用非常广泛,主要作用表现在产品识别,库存管理,销售管理,防伪保护等,这些作用使其成为现代商业和工业环境中不可或缺的工具,它极大地提高了数据处理的速度和准确性,降低了运营成本,并提高了整体的工作效率。影刀批量生成条......
  • 51c自动驾驶~合集25
    #AllWeather-Net拿捏所有天气!增强所有恶劣环境图像~论文题目:AllWeather-Net:UnifiedImageEnhancementforAutonomousDrivingUnderAdverseWeatherandLow-LightConditions论文链接:https://arxiv.org/pdf/2409.02045代码链接:https://github.com/Jumponthemoon/AllWeatherNe......
  • 如何将php代码连接到数据库表
    要将PHP代码连接到数据库表,你需要执行以下几个步骤:建立数据库连接:使用PHP的数据库连接函数(如mysqli_connect或PDO)建立与数据库的连接。这需要提供数据库的主机名、用户名、密码和数据库名称等信息。选择数据库:使用连接对象的方法(如mysqli_select_db或PDO的......