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.布局管理器

QT入门学习(1)_第1张图片

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()<

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

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

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

qDebug()<

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

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

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

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

b = 200;
str = QString::number(b);
qDebug()<<"str="<

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

//QString 转C++ string:
QString q_str1 = "hello";
std::string c_str1 = q_str1.toStdString();
std::cout<<"QString 转C++ string="<

你可能感兴趣的:(QT入门学习(1))