Qt 字符串、信号槽详解

目录

1.QT中字符串QString的使用

1.1.常见的函数

 1.2.总结QT中跟字符,字符串有关的类

   1.3.字符串列表StringList

2.信号与槽

1.作用

 2.右键转到槽函数

3.关联信号与槽函数(让你的信号跟槽函数之间形成一一对应关系)

   4.信号与槽的特点

3.总结

1.继承自QMainWindow举例 信号与槽(手动关联)

2.手动关联和自动关联信号与槽

3.信号带参数,槽函数可以带参数也可以不带

4.字符串QString的使用,这个类的函数很多,这里举例几个常用的,其他需要的话就问Al.


1.QT中字符串QString的使用

1.1.常见的函数

       (1)字符串的拼接

int a = 99;double b = 89.7;char c[10] = "gec";QString str=QString("%1@%2@%3").arg(a).arg(b).arg(c);   //%1   %2   %3分别跟第一个,第二个,第三个参数对应

       (2)判断子串

QString str="helloworld";bool ret=str.contains("uuo");  // truebool ret=str.contains('u');    // false

       (3)QT中的打印

#include <QDebug>qDebug()<<"hello";qDebug()<<a<<b<<c;qDebug("who is");int a =10;qDebug("%d",a);  //支持c++的std也可以像C语言printf           

       (4)截取子串

mid(int position, int n = -1)    参数: position --》从哪个位置开始截取子串(从0开始)          n --》你想要截取多长的子串

       (5)把整数转换成字符串

number(long n, int base = 10)      参数: n --》你要转换的整数   base=10  十进制默认      

       (6)分割字符串

 QStringList  split(const QString &sep);          返回值:字符串列表,用来保存切割得到的结果          参数:sep --》切割字符串的标准

       (7)字符串转换成整数

int QString::toInt(bool *ok = nullptr, int base = 10) const返回值:你转换得到的整数参数:ok  --》转换成功  true失败 falsebase --》按照哪种进制转换,默认是10进制

 1.2.总结QT中跟字符,字符串有关的类

               QString --》类似于string, 字符串

               QChar --》类似于char,表示单个字符

               QStringList --》用来保存多个字符串

QString str = "2021-11-05";QStringList mylist = str.split("-");for(int i=0; i < mylist.size(); i++) {  qDebug()<<mylist.at(i);}// 输出 2021  11  05

   1.3.字符串列表StringList

      (1)遍历StringList     

StringList  mylist;   //用来保存多个字符串的for(int i=0; i<mylist.size(); i++){  qDebug()<<mylist.at(i);}

2.信号与槽

图片

1.作用

用于组件和组件之间,组件和窗口之间进行通信

信号:本质上是个函数(很特殊,只有声明,没有定义,没有源码), 所有的组件QT都已经定义好了对应的信号

如何查看某个类(组件)有哪些信号

方法一:右键点击组件,转到槽即可看到该组件的所有信号

方法二:打开QT助手,搜索类,查看到所有的信号声明和介绍

槽函数 : 就是个普通函数,当信号产生的时候,槽函数会被自动调用执行相应的任务

 类比:进程间通信signal()

 2.右键转到槽函数

QT工程自动生成了如下代码:

头文件:   

private slots:   //声明一个私有的槽函数   slots槽函数的声明void on_pushButton_clicked();

源代码:                

 void MainWindow::on_pushButton_clicked()  //槽函数的定义 { }

 右键转到槽函数(槽函数有默认的命名规则)

on_组件对象的名字_信号的名字()

编程技巧

QT中ui界面拖过来的对象,建议你修改对象的名字,方便写代码

3.关联信号与槽函数(让你的信号跟槽函数之间形成一一对应关系)

总共有两种方法关联信号与槽函数

方法一:借助集成开发环境QT creator自动关联--》右键转到槽函数

方法二:程序员自己写代码关联信号与槽函数

connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)参数:  sender --》信号的发送者       signal --》发送什么信号       receiver --》信号的接收者       method --》要调用执行的槽函数
推荐使用简化模板:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
比如:connect(ui->bt2,SIGNAL(clicked()),this,SLOT(fun()));// 目前官方推荐的写法优点在实际编程中不用考虑参数类型,注意:当前类名为对应函数的类connect(ui->bt2,&当前类名::clicked,this,&当前类名::fun);

   4.信号与槽的特点

特点一:一个类如果要使用信号与槽,必须在这个类的定义中加上Q_OBJECT这个宏定义

Q_OBJECT叫做QT元对象系统,用来支持信号与槽这种机制

特点二:同一个信号可以关联多个不同的槽函数

此时多个槽函数都会被调用,槽函数的调用顺序是依照你关联的先后顺序依次调用

特点三:同一个槽函数可以被不同的信号关联

 QObject *QObject::sender() const  

返回值:成功 返回信号的发送者指针

特点四:信号如果带参数,槽函数可以带参数,也可以不带

 void cursorPositionChanged(int oldPos, int newPos)  //这个信号带有两个int类型的参数 void editingFinished()  //这个信号不带任何参数

如果槽函数跟着一起带参数 --》表示槽函数想要接收信号传递过来的参数值

如果槽函数没有带参数 --》表示槽函数不想接收信号传递过来的参数值  

3.总结

记住一点:信号没有共有、私有之分,,但槽函数有private槽和public槽之分。

私槽:只在当前类使用,即信号的发射和接收都是本类对象。

共槽:不同类之间,最常用多线程、网络编程等。

1.继承自QMainWindow举例 信号与槽(手动关联)

头文件:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
//声明槽函数
private slots:
    void fun();
private:    
Ui::MainWindow *ui;};
#endif // MAINWINDOW_H

源文件:

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

{    ui->setupUi(this);
    //多个不同对象关联一个槽函数,点击不同的按钮执行的是同一个函数
    connect(ui->bt1,SIGNAL(clicked()),this,SLOT(fun()));
    // 改变参数类型,必须在下面进行更改
    connect(ui->bt2,SIGNAL(clicked()),this,SLOT(fun()));
    // 可以随时变换参数 不管信号连接                                                                              connect(ui->bt3,&QAbstractButton::clicked,this,&MainWindow::fun);                connect(ui->le,SIGNAL(editingFinished()),this,SLOT(fun()));}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::fun(){
     //由于四个不同的对象,共用一个槽函数fun()
    //判断究竟是谁发送信号调用了fun
    QObject *obj = sender(); //获取信号的发送者
   // 第一种 不用进行类型转化  这些控件基本都是QObject的后代
    qDebug()<<"obj = "<<obj->objectName();


    QPushButton *button = qobject_cast<QPushButton *>(sender());
    //第二种 一般比较喜欢这种 专一性
    qDebug()<<"button = "<<button->objectName();
   //注意editingFinished点击时会错误,因为它不属于QPushButton类  所以为他另作一个槽函数或者使用第一种

    if (button == ui->bt1)
    {        qDebug()<<"我肯定地告诉你,你点击的是按钮1";    }
    if (button==ui->bt2)    {        qDebug()<<"我肯定地告诉你,你点击的是按钮2";    }
}

图片

2.手动关联和自动关联信号与槽

自动关联举例:双击打开.ui文件 ,转到槽

图片

图片

头文件:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    ~MainWindow();private slots:    void on_bt1_clicked(); // 自动生成的槽函数    void fun(); //我自定义了槽函数private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //手动关联另外一个按钮的信号与自己写的槽函数    connect(ui->bt2,SIGNAL(clicked()),this,SLOT(fun()));}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_bt1_clicked(){    qDebug()<<"我是自动关联的";}void MainWindow::fun(){    qDebug()<<"我手动关联的";}

3.信号带参数,槽函数可以带参数也可以不带

源文件:

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //手动关联QLineEdit的cursorPositionChanged(int oldPos, int newPos) 信号    connect(ui->lineEdit,SIGNAL(cursorPositionChanged(int,int)),this,SLOT(fun(int,int)));}MainWindow::~MainWindow(){    delete ui;}//void MainWindow::fun()  不带参数,表示fun拒绝接收信号传递过来的参数void MainWindow::fun(int arg1,int arg2){    qDebug()<<"自己写的槽函数:  "<<arg1<<"    "<<arg2;}

演示效果:

图片

图片

4.字符串QString的使用,这个类的函数很多,这里举例几个常用的,其他需要的话就问Al.

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //字符串的拼接    int a=99;    double b=89.7;    char c[10]="gec";    QString str1=QString("%1@%2@%3").arg(a).arg(b).arg(c);    QString str2=QString("%2@%1@%3").arg(a).arg(b).arg(c);    //打印结果    qDebug()<<"str1 = "<<str1<<" str2 = "<<str2;   // 判断子串    QString str3="helloworld";    bool ret1=str3.contains("uuo");    bool ret2=str3.contains('u');    qDebug()<<"ret1 = "<<ret1;    //截取子串    QString str4="hellogecworldchina";    QString otherstr=str4.mid(8,5);  // 如果你理解为下表从0开始,那第八位刚好是截取的第一位    qDebug()<<"otherstr = "<<otherstr;    //字符串转换成整数    QString str="123";    bool ok;    int ret3=str.toInt();    int ret4=str.toInt(&ok);    int ret5=str.toInt(&ok,8);  //把123当成是八进制的123,然后转换成10进制数    qDebug()<<"ret5 = "<<ret5<<"   ok = "<<ok;   //整数转换成字符串    int aa=666;    QString ret=QString::number(aa,16); // 转化为16进制字符串    qDebug()<<"toUpper = "<<ret.toUpper(); //转为大写    //分割字符串    QString slipt="2021-11-05";    QStringList mylist=slipt.split("-");    for(int i=0; i<mylist.size(); i++)        qDebug()<<i<<" = "<<mylist.at(i);}MainWindow::~MainWindow(){    delete ui;}

效果演示:

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

响应式数据(v-on、v-if、v-show、v-for、v-bind、v-model、computed、watch)

目录 一、事件绑定指令v-on 二、条件渲染指令v-if 三、v-show 四、遍历指令v-for 1、遍历对象的值 2、遍历对象的值和键&#xff08;先值后键&#xff09; 3、遍历对象的值、键和索引 4、遍历数组的值和索引 五、属性动态化指令v-bind(单向) 【CSS样式的绑定&#…

设计模式之 命令模式

命令模式&#xff08;Command Pattern&#xff09;是行为型设计模式之一&#xff0c;它将请求&#xff08;或命令&#xff09;封装成一个对象&#xff0c;从而使用户能够将请求发送者与请求接收者解耦。通过命令模式&#xff0c;调用操作的对象与执行操作的对象不直接关联&…

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…

使用eclipse构建SpringBoot项目

我这里用eclipse2018版本做演示&#xff0c;大家有需要的可以下载Eclipse Downloads | The Eclipse Foundation 1.打开eclipse&#xff0c;选择存放代码的位置 2.选择 file >> new >> project >> 选择springboot文件下的 spring starter project 2.这里选择N…

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网&#xff1a;控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

绕过CDN寻找真实IP

在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器&#xff0c;实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自…

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内&#xff0c;主机之间具有相同的网络号&#xff0c;但是必须有不同的主机号 互联网中的每一台主机&#xff0c;都要隶属于某一个子网 -&…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式&#xff1a;页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

Go语言链接Redis数据库

1.使用go get命令安装go-redis/v8库&#xff1a; 我这里使用的vscode工具安装&#xff1a; go get github.com/go-redis/redis/v82.创建Redis客户端实例 使用以下Go代码连接到Redis服务器并执行命令&#xff1a; package mainimport ("context""fmt"&q…

1-测试go-redis缓存数据

1-测试go-redis缓存数据 1.go-redis缓存数据测试效果 a.测试页面 测试页面&#xff1a;--这里使用 Postman 来做测试 http://127.0.0.1:8000/article/getone/3 http://127.0.0.1:8000/article/getone/4 http://127.0.0.1:8000/article/getone/5b.测试效果 查看终端&#xf…

查看浏览器的请求头

爬虫时用到了请求头&#xff0c;虽然可以用网上公开的&#xff0c;但是还是想了解一下本机浏览器的。以 Edge 为例&#xff0c;其余浏览器通用。 打开浏览器任一网页&#xff0c;按F12打开DevTools&#xff1b;或鼠标右键&#xff0c;选择“检查”。首次打开界面应该显示在网页…

git branch -d 删除分支

Git进行版本控制时&#xff0c;删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时&#xff0c;删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支&#xff0c;需要分别执行以下两个命令。 一…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮助企业实现供应商关系管理和采购线上化、移动化、智能…

[论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录

《深度异常检测综述》总结梳理 目录 一、研究背景与挑战二、深度异常检测方法分类三、实验评估四、结论在这篇文章中&#xff0c;**异常检测的异构性**主要从以下几个方面来理解&#xff1a;如何理解多源数据融合的困难“学习正常性的特征表示”与“用于特征提取的深度学习”在…

linux下i2c开发与框架源码分析

目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysql命令进行修改&#…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的&#xff0c;那么创建完毕rdd以后他的分区数量是多少&#xff1f; 从hdfs读取文件的方式是最正规的方式&#xff0c;我们通过计算原理可以推出blk的个数和分区数量是一致的&#xff0c;本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…