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)判断子串
(3)QT中的打印 #include <QDebug> qDebug()<<'hello'; qDebug()<<a<<b<<c; qDebug('who is'); int a =10; qDebug('%d',a); //支持c++的std也可以像C语言printf (4)截取子串
(5)把整数转换成字符串 number(long n, int base = 10) 参数: n --》你要转换的整数 base=10 十进制默认 (6)分割字符串
(7)字符串转换成整数 int QString::toInt(bool *ok = nullptr, int base = 10) const 返回值:你转换得到的整数 参数:ok --》转换成功 true失败 false base --》按照哪种进制转换,默认是10进制 2.总结QT中跟字符,字符串有关的类 QString --》类似于string, 字符串 QChar --》类似于char,表示单个字符 QStringList --》用来保存多个字符串
3.字符串列表StringList (1)遍历StringList StringList mylist; //用来保存多个字符串的 for(int i=0; i<mylist.size(); i++){ qDebug()<<mylist.at(i); } 信号与槽 1.作用 用于组件和组件之间,组件和窗口之间进行通信 信号:本质上是个函数(很特殊,只有声明,没有定义,没有源码), 所有的组件QT都已经定义好了对应的信号 如何查看某个类(组件)有哪些信号 方法一:右键点击组件,转到槽即可看到该组件的所有信号 方法二:打开QT助手,搜索类,查看到所有的信号声明和介绍 槽函数 : 就是个普通函数,当信号产生的时候,槽函数会被自动调用执行相应的任务 类比:进程间通信signal() 2.右键转到槽函数 QT工程自动生成了如下代码: 头文件:
源代码: void MainWindow::on_pushButton_clicked() //槽函数的定义 {
} 右键转到槽函数(槽函数有默认的命名规则) on_组件对象的名字_信号的名字() 编程技巧 QT中ui界面拖过来的对象,建议你修改对象的名字,方便写代码 3.关联信号与槽函数(让你的信号跟槽函数之间形成一一对应关系) 总共有两种方法关联信号与槽函数 方法一:借助集成开发环境QT creator自动关联--》右键转到槽函数 方法二:程序员自己写代码关联信号与槽函数
4.信号与槽的特点 特点一:一个类如果要使用信号与槽,必须在这个类的定义中加上Q_OBJECT这个宏定义 Q_OBJECT叫做QT元对象系统,用来支持信号与槽这种机制 特点二:同一个信号可以关联多个不同的槽函数 此时多个槽函数都会被调用,槽函数的调用顺序是依照你关联的先后顺序依次调用 特点三:同一个槽函数可以被不同的信号关联 QObject *QObject::sender() const 返回值:成功 返回信号的发送者指针 特点四:信号如果带参数,槽函数可以带参数,也可以不带 void cursorPositionChanged(int oldPos, int newPos) //这个信号带有两个int类型的参数 void editingFinished() //这个信号不带任何参数 如果槽函数跟着一起带参数 --》表示槽函数想要接收信号传递过来的参数值 如果槽函数没有带参数 --》表示槽函数不想接收信号传递过来的参数值 两种设计ui界面的方法,以及区别 1.设计ui界面的两种方法 第一种:借助ui设计师直接拖动组件(本质上也生成代码了,在构造函数中) 写代码: ui->组件对象名字->方法() 第二种: 程序员自己写代码创建的对象
Qt常见错误 【1】关闭这个: 【2】删除.user 【3】Ctrl+Alt+Del 打开:任务管理器,关闭 本节项目知识巩固 记住一点:信号没有共有、私有之分,,但槽函数有private槽和public槽之分。 私槽:只在当前类使用,即信号的发射和接收都是本类对象。 共槽:不同类之间,最常用多线程、网络编程等。 【1】继承自QMainWindow举例 信号与槽(手动关联) 头文件:
源文件: #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文件 ,转到槽 头文件:
源文件: #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】信号带参数,槽函数可以带参数也可以不带 源文件:
演示效果: 【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隐藏密码显示密码 头文件:
源文件: #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输入框颜色设置 源文件:
|
|