QT入门学习(1)

基于QT5.8版本的基础学习知识点整理(部分)

1. 信号与槽机制

信号

当某个信号对其所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行。 如果存在多个槽与某个信号相关联,当这个信号被发射时,执行的顺序是随机的,无法人为确定。信号的声明是在头文件中进行的。信号没有函数体定义,并且信号的返回类型都是void。
Q_SIGNALS:
    void clicked(bool checked = false);


槽是普通的C++成员函数,可以被正常调用,唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,信号关联的槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。槽是普通的成员函数,也有访问权限。槽的访问权限决定了谁能够与其相关联。槽也能够声明为虚函数。槽的声明在头文件中进行的。
槽函数分为三种类型,即public slots、private slots和protected slots。
public slots:使用publicslots声明的槽表示任何对象都可将信号与之相连接。在组件编程中,可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
protected slots:使用protected slots声明的槽表示当前类及其子类可以将信号与之相连接。适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
private slots:使用privateslots声明的槽表示只有类自己可以将信号与之相连接,适用于联系非常紧密的类。

private slots:
    void login();

自定义槽:
只有QObject的子类才能自定义槽;
定义槽的类必须在类声明的最开始处使用Q_OBJECT;
类中声明槽是需要使用slots关键字;
槽与所处理的信号在函数签名上必须一致;
SIGNAL与SLOT指定的名称中可以包含参数类型,不能包含具体的参数名。

信号与槽的关联
通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,当发射者对象发射信号时,接收者对象的槽函数将被调用。connect函数的定义如下:

bool QObject::connect ( const QObject *sender, const char * signal, const QObject * receiver, const char *method,Qt::ConnectionType type = Qt::AutoConnection )

connect函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的method槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect 调用中接收者参数可以省略。
当信号与槽没有必要继续保持关联时,可以使用disconnect函数来断开连接。

bool QObject::disconnect ( const QObject *sender, const char * signal, const QObject * receiver, const char *method )

disconnect函数断开发射者中的信号与接收者中的槽函数之间的关联。

在disconnect函数中0可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender不能为0,其它三个参数的值可以等于0。
eg:

connect(button,SIGNAL(clicked()),this,SLOT(login()));//登录信号与槽函数链接

2.布局管理器

在这里插入图片描述

3.字符串类

字符串有如下几个操作符:
(1)QString提供了一个二元的“+”操作符用于组合两个字符串,并提供了一个“+=”操作符用于将一个字符串追加到另一个字符串的末尾;

(2)QString::append()函数具有与“+=”操作符同样的功能,实现在一个字符串的末尾追加另一个字符串

(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样

QString str;  
str.sprintf("%s"," Hello "); //str="Hello "  
str.sprintf("%s"," world! "); //str="world! "  
str.sprintf("%s %s"," Hello ", "world! "); //str=" Hello world! " 

**(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。**此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点数精度进行控制。通常,相对于函数QString::sprintf(),函数QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变"%n"参数的顺序。例如:

QString str;  
str=QString("%1 was born in %2.").arg("Jack").arg(1998);//str="Jack was born in 1998."  

(5)QString也提供了一些其他组合字符串的方法,包括如下几种。

① insert()函数:在原字符串特定的位置插入另一个字符串;
② prepend()函数:在原字符串的开头插入另一个字符串;
③ replace()函数:用指定的字符串代替原字符串中的某些字符。
(6)很多时候去掉一个字符串两端的空白(空白字符包括回车字符“\n”、换行字符“\r”、制表符“\t”和空格字符“ ”等)非常有用,如获取用户输入的账号时。
① QString::trimmed()函数:移除字符串两端的空白字符;
② QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符“ ”代替字符串中出现的空白字符。
例如:

QString str="Hello \t world! ";
str=str.trimmed(); //str=" Hello \t world! "

(7)查询字符串的数据
①startsWith(); 以某个字符串开头,有两个参数,第一个参数是需要查找的字符串,第二个参数是,是否区分大小写,第二个参数可以不写,默认是区分大小写的

QString str = "www.baidu.com";
qDebug()<<str.startsWith("www."); //默认区分大小写,返回true
qDebug()<<str.startsWith("wWw."); //默认区分大小写,返回false

②endWith(); 以某个字符串结尾(和startWith用法类似)

qDebug() << str.endsWith("coM",Qt::CaseInsensitive); //忽略大小写,返回true

③ contains();判断是否包含某个字符串

qDebug()<<str.contains("baiDu",Qt::CaseSensitive); //区分大小写:false
qDebug()<<str.contains("baiDu",Qt::CaseInsensitive); //不区分大小写:true

(8)比较字符串大小
和c/c++一样是以ascii码的方式比较字符串,当第一个字符不相同时,结果就确定,不会再继续向下面比较。 a<z(ascii)
①运算符重载"<,<=,= =,<,>,>="; 运算符左边的ascii码和右边的ascii逐位比较,结果为bool类型。

QString str = "cabc";//重载比较运算符,返回bool
qDebug() << (str < "b"); //false
qDebug() << (str <= "b"); //false
qDebug()<< (str == "b"); //false
qDebug()<< (str > "b"); //true
qDebug() << (str >= "b"); //true
qDebug() << (str < "d"); //true

②localeAwareCompare();使用本地字符集locale比较,返回整型,大于返回正整数,等于返回0,小于返回负整数

int ret = 0;
ret =QString::localeAwareCompare(str,"abcdef"); //ret= 1
qDebug()<<"ret="<<ret;
ret =QString::localeAwareCompare(str,"cabc"); //ret= 0
qDebug() <<"ret="<<ret;
ret =QString::localeAwareCompare(str,"gabcef"); //ret= -1
qDebug() <<"ret="<<ret;

③QString::compare();可指定区分大小写的比较,如果不相等,返回值和localeAwareCompare的返回值方式类似。

ret = QString::compare("bcd","bcd"); //默认区分大小写:0
qDebug() <<"ret="<<ret;
ret = QString::compare("bcd","Bcd"); //默认区分大小写:32
qDebug() <<"ret="<<ret;
ret = QString::compare("bcd","Bcd",Qt::CaseSensitive); //区分大小写:32
qDebug() <<"ret="<<ret;
ret = QString::compare("bcd","Bcd",Qt::CaseInsensitive); //不区分大小写:0
qDebug()<<"ret="<<ret;

(9)字符串转换
①字符串 --> 基础数据(int等):
函数原型:
int QString::toInt(bool *ok = Q_NULLPTR, int base = 10) const
参数1接收转换的结果,转成功为true,失败false,参数2,是指定字符串内的原始数据是多少进制的,也就是说,是需要把字符串中的数据是以多少进制转换为10进制。)
参数1和参数2可以不指定,参数1不指定时,不接收转换结果。
参数2不指定时默认字符串中的数据是10进制的)
参数2不指定时,默认为10进制,如果设置为0时,则会使用c语言的转换方法,即:如果字符串以“0x”开头,则基数为16,如果以“0”开头,则基数为8,其他情况,基数都为10;

QString::toInt(无参数);    
QString str = "0168";
int atr = s70.toInt();
qDebug()<<"atr="<<atr; //atr= 168
 
str = "0.168";
double atr = str.toDouble();
qDebug() <<"atr="<<atr; //atr= 0.168
 
str = "hello qt";
atr = str.toInt();
qDebug()<<"atr="<<atr; //转换失败,数据为0

②QString::toInt(参数1,参数2); 对转换结果进行判断,并按照指定的进制基数进行转换。

bool ok = false;
str = "0168";
atr = str.toInt(&ok,16); //指定字符串中的数据是16进制,把他转换为10进制
if(ok)
{
qDebug()<<"str = 0168:"<<"16进制转换10进制成功,数据是:"<<atr; //数据是:360
}
else
{
qDebug()<<"str = 0168:"<<"16进制转换10进制失败!";
}
 
str = "0167"; //如果数据超过了8进制的范围,则转换失败
atr= s70.toInt(&ok,8);
if(ok)
{
qDebug()<<"str = 0167:"<<"8进制转换10进制成功,数据是:"<<atr; //数据是:119
}
else
{
qDebug()<<"str = 0167:"<<"8进制转换10进制失败!";
}
 
str = "hello qt";
atr = str.toInt(&ok); //不指定第二个参数默认转换为10进制
if(ok)
{
qDebug()<<"str = hello qt :"<<"转换成功,数据是:"<<atr;
}
else
{
qDebug()<<"str = hello qt :"<<"转换失败!"; //数据转换失败
}

②基础数据(int等) --> 字符串:
a)QString::arg(); 组包的方式:

int b = 100;
QString str = QString("%1").arg(b);
qDebug() <<"str="<<str; //str= "100"

b)QString::number(); 更简便的方式:

b = 200;
str = QString::number(b);
qDebug()<<"str="<<str; //str= "200"
 
double d = 0.852;
str = QString::number(d);
qDebug() <<"str="<<str; //str= "0.852"

③标准string和QTstring的互换(引入了c++的iostream的头文件,和string头文件)

//QString 转C++ string:
QString q_str1 = "hello";
std::string c_str1 = q_str1.toStdString();
std::cout<<"QString 转C++ string="<<c_str1<<std::endl;
 
//C++ string 转QString:
std::string c_str2 = "world";
 
QString q_str2 = QString::fromStdString(c_str2);
qDebug()<<"C++ string 转QString="<<q_str2;

(10)NULL字符串和Empty空字符串的区别
一个NULL字符串是使用QString的默认构造或者使用“(const char*)0”作为参数的构造函数创建的QString字符串对象;而一个空字符串是一个大小为0的字符串,一个NULL字符串一定是一个字符串,而一个空字符串未必是一个NULL字符串。例如:
QString str1 = QString();
qDebug()<<str1.isNull(); //true
qDebug()<<str1.isEmpty(); //true

QString str2 = QString("");
qDebug()<<str2.isNull(); //false
qDebug()<<str2.isEmpty(); //true
 
qDebug()<<"以下代码和上面等价:";
qDebug()<<QString().isNull(); //true
qDebug()<<QString().isEmpty(); //true
qDebug()<<QString("").isNull(); //false
qDebug()<<QString("").isEmpty(); //true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值