QT学习笔记2

news2025/1/19 11:30:12

1.重载自定义信号与槽:

定义天黑类:里面有一个有参数的信号和没有参数的信号

tianhei.h

#ifndef TIANHEI_H
#define TIANHEI_H

#include <QObject>

class Tianhei : public QObject
{
    Q_OBJECT
public:
    Tianhei();  //构造函数声明

signals:
    void tianhei();
    void tianhei(QString name);  //信号只需声明

public slots:
};

#endif // TIANHEI_H

定义想你类:同样一个有参数一个没有参数

xingni.h

#ifndef XINGNI_H
#define XINGNI_H

#include <QObject>

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

signals:

public slots:
    void xiangni();
    void xiangni(QString name);   //槽函数
};

#endif // XINGNI_H

xingni.c

#include "xingni.h"
#include <QDebug>

Xingni::Xingni(QObject *parent) : QObject(parent)
{

}

void Xingni::xiangni(){

    qDebug()<<"想你了";

}

void Xingni::xiangni(QString name){

    qDebug()<<"想你了"<<name;

}

我们选择第一种按键绑定方式,即用中转函数,

点击按钮,按钮发送点击信号,MainWindow接收信号,执行heilai()函数;

heilai()函数会让hei发送tianhei信号,xing接收信号执行xingni槽函数;

但是我们发现,由于信号函数和槽函数存在两个重名的函数,一个有参数,一个没有参数,程序存在歧义,不知道执行哪一个,这时候就是指针大显身手的时候了。我们定义一个函数体指针分别接收有参数的信号函数和槽函数,把两个指针传到connect中去就好了;

mainwindow.c
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);

    this->setWindowTitle("love");

    //设置固定大小,设置完成不可拉伸
    this->setFixedSize(400,300);


    QPushButton *butten=new QPushButton("点我天黑",this);
    butten->move(150,100);
    //定义一个按钮实例子
    this->hei =new Tianhei();  //实例化对象,注意后面括号
    this->xing =new Xingni();


    void (Xingni::*XINGNI)(QString)=&Xingni::xiangni;
    void (Tianhei::*TIANHEI)(QString)=&Tianhei::tianhei;
//    connect(butten,&QPushButton::clicked,hei,XINGNI);
    connect(butten,&QPushButton::clicked,this,&MainWindow::heilai);
    connect(hei,TIANHEI,xing,XINGNI);


    //天黑发出天黑信号,xing接收,调用槽函数;

}


void MainWindow::heilai(){
     qDebug()<<"天要黑了!";
    emit hei->tianhei("刘亦菲");  //定义的有参数所以要传参
}



MainWindow::~MainWindow()
{
    delete ui;
}

 void (Xingni::*XINGNI)(QString)=&Xingni::xiangni;
 void (Tianhei::*TIANHEI)(QString)=&Tianhei::tianhei;

void是函数返回值,(Xingni::*XINGNI)(QString)=&Xingni::xiangni;XINGNI中是Xingni::xiangni的地址,由于前边有参数,因此会自动传有参数的函数地址。

 QString----->QByteArray-------->char *    去引号

qDebug()<<"想你了"<<name.toUtf8().data();

 

2.信号与槽总结

(1)发送者与接收者是需要是QObjec的子类(槽函数是全局,lambda除外)

(2)信号与槽返回值都是void类型。

(3)信号只需要声明不需要定义实现,槽函数需要声明也需要实现(注意继承方式,public,private,protected)。

(4)槽函数是普通函数,会受到public,private,protected影响。

(5)使用emit在恰当的位置发送信号

(6)任何成员函数,static函数,全局函数和Lambda表达式都可以作为槽函数

(7)使用connect()函数连接信号与槽

(8)信号与槽的参数要一致,参数类型一致,槽函数参数可以比信号少,但是顺序要一直。

举例:

        signal(Qstring)和slot(Qstring)

        signal(Qstring,Qstring)和slot(Qstring)

        signal(Qstring,Qstring)和slot(Qstring,int)错误

        signal(Qstring,Qstring,int)和slot(Qstring,Qstring)

        signal(Qstring,Qstring,int)和slot(Qstring,int)  错误

(9)信号与槽可以一对一,一对多(发出信号,槽函数一个一个执行,顺序不确定)多对一(发出任意一个信号,槽函数都执行)

(10)信号可以连接信号

(11)槽可以断开连接(disconnect),槽可以被取消连接(当一个对象delete了,取消这个连接)

(12)可以使用C++11中的lambda

3.Lambda表达式

格式:[capture] (parameters) mutable -> return-type {statement}

(1)[ ]标识一个Lambda的开始,这部分必须存在,不能省略

(2)()参数列表,如果不需要传递参数的话,()可以一同省略

(3)如果使用mutable,参数列表()不能省略,即使参数为空。如果使用mutable修改拷贝,值本身不变。

(4) -> return-type返回值类型,如果不需要可以省略;

(5){statement}函数体,可以使用参数列表,也可以使用捕获列表;

1)传参Lambda

#include <iostream>
using namespace std;
int main() {
	int a = 1, b = 2;
	auto A1 = [](int x, int y)->int {return x + y; };
	cout << A1(a, b);
	return 0;
}

2)捕获列表(只读)

利用捕获列表传参

#include <iostream>
using namespace std;
int main() {
	int a = 1, b = 2;
	auto A1 = [a,b]()->int {return a + b; };
	cout << A1();
	return 0;
}

此时不能修改a和b的值,因为默认传参方式是“=”,只有读权限,没有修改权限

#include <iostream>
using namespace std;
int main() {
	int a = 1, b = 2,c=3;
	auto A1 = [=]()->int {return a + b+c; };
	cout << A1();
	return 0;
}

 [=]将匿名函数范围内的所有局部变量捕获

2)捕获列表(修改)

#include <iostream>
using namespace std;
int main() {
	int a = 1, b = 2, c = 3;
	auto A1 = [&]()->int { a = 3, b = 3; return a + b + c; };
	cout << "a=" << a << endl << "b=" << b << endl << "c=" << c << endl;
	cout << A1();
	return 0;
}

[&] 引用传值,因此可以改变值,但是改变的值是copy的值,函数外的值不改变。

#include <iostream>
using namespace std;
int main() {
	int a = 1, b = 2, c = 3;
	auto A1 = [=]()mutable->int { a = 3, b = 3; return a + b + c; };
	cout << "a=" << a << endl << "b=" << b << endl << "c=" << c << endl;
	cout << A1();
	return 0;
}

        

 4.MainWindow:提供对话框

一个菜单栏(menu bar),多个工具栏(tool bar),多个铆接部件(dock widgets)(浮动窗口),一个状态栏(status bar),一个中心部件(central widget)

1)菜单栏:

        (1)菜单栏类QMenuBar:创建菜单栏

        (2)菜单类QMenu:创建菜单

        (3)QAction:充当子菜单

QMenuBar *menubar=new QMenuBar(this); //创建菜单栏两种方法
QMenuBar *menubar=menuBar();

 this->setMenuBar(menubar);  //添加到该页面中


QMenu *menu1=new QMenu("文件");  //创建菜单
menubar->addMenu(menu1)     //将menu添加到menubar菜单栏中

QAction *act1=new QAction("打开文件");  //创建子菜单
menu1->addAction(act1);     //将act1添加menu1子菜单中



#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    resize(800,600);
    ui->setupUi(this);
  //  QMenuBar *menubar=new QMenuBar(this);
    QMenuBar *menubar=menuBar();
    //创建菜单栏
    this->setMenuBar(menubar);
    //创建菜单
    QMenu *menu1=new QMenu("文件");
    QMenu *menu2=new QMenu("编辑");
    QMenu *menu3=new QMenu("构建");
    QMenu *menu4=new QMenu("调试");
    QMenu *menu5=new QMenu("Analyze");
    QMenu *menu6=new QMenu("工具");
    QMenu *menu7=new QMenu("控件");
    QMenu *menu8=new QMenu("帮助");
    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);
    menubar->addMenu(menu4);
    menubar->addMenu(menu5);
    menubar->addMenu(menu6);
    menubar->addMenu(menu7);
    menubar->addMenu(menu8);


    QAction *act1=new QAction("新建文件");
    QAction *act2=new QAction("打开文件");
    QAction *act3=new QAction("另存为");
    QAction *act4=new QAction("关闭");
    QAction *act5=new QAction("最近访问文件");
    QAction *act6=new QAction("保存文件");
    QAction *act7=new QAction("打印");
    QAction *act8=new QAction("退出");
    menu1->addAction(act1);
    menu1->addAction(act2);
    menu1->addAction(act3);
    menu1->addAction(act4);
    menu1->addAction(act5);
    menu1->addAction(act6);
    menu1->addAction(act7);
    menu1->addAction(act8);

    connect(act1,&QAction::triggered,[=](){qDebug()<<"已新建文件";});
    connect(act2,&QAction::triggered,[=](){qDebug()<<"已打开文件";});
    connect(act3,&QAction::triggered,[=](){qDebug()<<"已另存为文件";});
    connect(act4,&QAction::triggered,this,&MainWindow::close);
    connect(act5,&QAction::triggered,[=](){qDebug()<<"最近访问文件";});
    connect(act6,&QAction::triggered,[=](){qDebug()<<"已保存文件";});
    connect(act7,&QAction::triggered,[=](){qDebug()<<"打印文件";});
    connect(act8,&QAction::triggered,[=](){qDebug()<<"退出";});
}

MainWindow::~MainWindow()
{
    delete ui;
}

 这样一个简易的菜单栏就写完了

 点击就会执行自己定义的函数,接下来只需要真正保存,新建文件等函数就可以了,我只写了关闭,别的用Lambda代替,实测是可以的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 用户的特殊shell与PAM模块

文章目录Linux 用户的特殊shell与PAM模块特殊的shell&#xff1a;/sbin/nologinPAM模块简介PAM模块设置语法常用模块简介login的PAM验证机制流程其他相关文件limits.conf使用案例/var/log/secure、/var/log/messagesLinux 用户的特殊shell与PAM模块 你想过吗&#xff1f;如果我…

无向连通图中长度为 n 的循环

给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …

【一起啃书】《机器学习》第一章 绪论 + 第二章 模型评估与选择

第一章 绪论 1.机器学习&#xff1a;研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。在计算机系统中&#xff0c;”经验“通常以“数据”的形式存在&#xff0c;所以机器学习研究的主要内容也是如何通过这些数据产生一个模型&#xff0c;进而通过这个模型为…

基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】

您好&#xff0c;我是码农飞哥&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 ❤️ 2.网上优质的Python题库很少…

Hello之CJavaPython

​ 前言&#xff0c;原来是java程序员&#xff0c;最近学习了一段时间发现&#xff0c;java只关注业务逻辑的开发&#xff0c;封装了很多的东西&#xff0c;导致底层的许多东西不是太了解&#xff0c;突然某一天&#xff0c;灵光凸现&#xff0c;既然语言都是相通的&#xff0c…

工业机器人远程监控解决方案

一、项目背景 随着我国科技不断进步发展和产业升级的不断进行&#xff0c;现阶段机器人应用在生产制造行业以及运输行业已经变得越来越广泛。工业机器人机构复杂、维护成本高&#xff0c;机器人应用的这一行业现状&#xff0c;对工业机器人生产企业的产品高品质服务能力提出了…

Samba共享

关闭selinux跟防火墙 setenforce 0 systemctl stop firewalld 安装samba以及客户端 yum install samba samba-client -y 创建共享目录 mkdir -p /data/share1 mkdir -p /data/public 添加samba用户并配置权限 useradd zsuser smbpasswd -a zsuser 修改配置文件并重启服…

linux线程调度策略

系统中既有分时调度&#xff0c;又有时间片轮转调度和先进先出调度 学习这个主要为了在linux多线程中&#xff0c;解决几条指令间延时在1-2ms内&#xff1b; 1.比如之前处理过&#xff1a;给一个板子发送一个can指令&#xff0c;接着需要给另外一个模块发送移动指令&#xff0c…

ESP32设备驱动-CCS811数字气体空气质量传感器驱动

CCS811数字气体空气质量传感器驱动 文章目录 CCS811数字气体空气质量传感器驱动1、CCS811介绍2、硬件准备3、软件准备4、驱动实现1、CCS811介绍 CCS811 是一种低功耗数字气体传感器解决方案,它集成了用于检测通常在室内发现的低水平 VOC 的气体传感器解决方案、微控制器单元 …

机器学习——分类算法

K-近邻算法(KNN) K Nearest Neighbor算法又叫KNN算法&#xff0c;它的原理是如果一个样本在特征空间中的k个最相似&#xff08;即特征空间中最邻近&#xff09;的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。 两个样本间距离可通过欧式距离计算&#x…

FE_HTML标签学习

1 图像标签 <body> <img src"./image/img.png" alt"图片标签属性" title"提示文本&#xff0c;鼠标放到图像上显示的文字" > </body>2 超链接标签 <body><h4>1.外部链接</h4><a href"http://www.…

4点决定你在银行的到手薪资

众所周知&#xff0c;银行的工资水平在整个国家中也是排名靠前的。然而&#xff0c;全国范围之内&#xff0c;有4000多家银行&#xff0c;有20多万个网点&#xff0c;不同的银行&#xff0c;甚至同一银行不同区域的网点之间的工资差别都是比较大的&#xff0c;即使是在同一家银…

手搭手SpringBoot之REST接口风格

REST一种软件架构风格 REST即表述性状态传递&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST,中文&#xff1a;表示层状态转移&#xff09;是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计…

gRPC-Go源码解读二 传输层数据处理流程

本篇文章主要介绍gRPC Client传输层的处理流程&#xff0c;如有疑问&#xff0c;欢迎指教。 gRPC版本&#xff1a; 1.54.0-dev gRPC基于http2传输&#xff0c;传输层主要处理http2相关的内容。RFC7540制定了http2协议规范&#xff0c;因此&#xff0c;这部分代码的逻辑绝大部分…

科普|FCC的卫星标准 为什么又说是FCC Part25呢?

我们今天介绍的FCC的卫星标准&#xff0c;在美国是作为一种法律规定&#xff0c;具有法律效力的标准&#xff0c;通常又称为法规文件。 01 — FCC Part 25 我们先从CFR说起&#xff0c;《美国联邦法规》&#xff08; Code of Federal Regulations &#xff0c;简称CFR&#…

【JAVAEE】网络原理之网络发展史

目录 &#x1f381;1. 独立模式 &#x1f383;2. 网络互连 &#x1f388;2.1 局域网 LAN ✨2.1.1 基于网线直连 &#x1f451;2.2.2 基于集线器组建 &#x1f48b;2.2.3 基于交换机组建 &#x1f457;2.2.4 基于交换机与路由器组建 &#x1f388;2.2 广域网 21世纪是一…

我的第一台电脑------计算机类专业学生购置电脑的一些个人心得

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

Web 攻防之业务安全:接口参数账号篡改测试(修改别人邮箱 || 手机号为自己的)

Web 攻防之业务安全&#xff1a;接口参数账号篡改测试. 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务…

HCIP之LSP静态搭建实验

目录 HCIP之LSP静态搭建实验 实验图 基本配置 R1 R2 R3 R4 配置方法 搭建从1.0 - 4.0 网段的LSP 搭建静态路由 配置MPLS 配置LSR - ID 激活MPLS 全局激活 接口激活 搭建静态LSP 搭建入站LSR R1配置 搭建中转LSR R2配置 R3配置 搭建出站LSR R4配置 搭建从…

Java语言-----泛型的认识

目录 一.什么是泛型 二.泛型类的使用 2.1泛型类的定义 2.2泛型类的数组使用 三.泛型的上界 四.泛型的方法 五.泛型与集合 &#x1f63d;个人主页&#xff1a; tq02的博客_CSDN博客-C语言,Java领域博主 &#x1f308;梦的目标&#xff1a;努力学习&#xff0c;向Java进发…