目录
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"); // true
bool 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失败 false
base --》按照哪种进制转换,默认是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_NAMESPACE
namespace 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;
}
效果演示: