分享

Qt 字符串(QString)、信号与槽(QObject)详细篇

 汉无为 2023-08-26 发布于湖北

QT中字符串QString的使用

   大胆猜测---》以我们的智商能够想到的方法,基本上QT都给你做好了

                         如果真的没有这个方法,自己动手封装

   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进制

   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

   3.字符串列表StringList

      (1)遍历StringList      

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

信号与槽

图片

   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(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() //这个信号不带任何参数

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

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

两种设计ui界面的方法,以及区别

    1.设计ui界面的两种方法

                 第一种:借助ui设计师直接拖动组件(本质上也生成代码了,在构造函数中)

                               写代码:  ui->组件对象名字->方法()

                 第二种:  程序员自己写代码创建的对象

QPushButton  bt1;  // 栈空间QPushButton *bt2 = new QPushButton;  //堆空间写代码:bt1.setFont();  //bt1根本不属于ui       bt2->setFont();       connect(&bt1,SIGNAL(clicked()).............);       connect(bt2,SIGNAL(clicked()).............);

Qt常见错误

图片

【1】关闭这个:

图片

【2】删除.user

图片

【3】Ctrl+Alt+Del 打开:任务管理器,关闭

图片


本节项目知识巩固

记住一点:信号没有共有、私有之分,,但槽函数有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_NAMESPACE
class MainWindow : public QMainWindow{ Q_OBJECT
public: 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;}

效果演示:

图片

作业1隐藏密码显示密码

头文件:

#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 on_pushButton_3_clicked();
private: Ui::MainWindow *ui; int n; //统计你点击按钮的次数};#endif // MAINWINDOW_H

源文件:

#include 'mainwindow.h'#include 'ui_mainwindow.h'
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); n=0;}
MainWindow::~MainWindow(){ delete ui;}
// 自动生成的槽函数void MainWindow::on_pushButton_3_clicked(){ n++; // 偶数隐藏 if(n%2==0) { ui->lineEdit_2->setEchoMode(QLineEdit::Password);
} else //奇数密码显示 { ui->lineEdit_2->setEchoMode(QLineEdit::Normal); }}

UI界面设计:

图片

图片

效果演示:

图片

图片

作业2输入框颜色设置

源文件:

#include 'colorwin.h'#include 'ui_colorwin.h'#include <QDebug>colorwin::colorwin(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::colorwin){    ui->setupUi(this);}
colorwin::~colorwin(){ delete ui;}

void colorwin::on_okbt_clicked(){ //获取你输入的红绿蓝颜色值 QString r=ui->redle->text(); QString g=ui->greenle->text(); QString b=ui->bluele->text();
//字符串的拼接--》得到完整的qss语句 QString cmd=QString('QMainWindow{background-color:rgb(%1,%2,%3);}').arg(r).arg(g).arg(b); //把主窗口的背景色修改成你刚才输入的颜色 this->setStyleSheet(cmd);
}
void colorwin::on_redle_editingFinished(){ qDebug() <<'红色输入框输入完毕';}

图片

图片

图片

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多