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;}

效果演示:

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值