一、编译方式
1、Qt内部编码方式:unicode编码
可以表示所有常见的文件,提供世界上几乎所有的文字的唯一编码方式。具有通用性;具有两字节和四字节标准。
但是我们在编写代码时,不能采用unicode编码,因为unicode编码每个字符都采用两个字符表示,但是char类型只有一个字节。多余的用0表示,但是字符串的结束标志就是空,所以不能用unicode编码方式来写代码。
查看QString帮助,可以看到,它也是提供的unicode编码。在QT中所有字符串都要转换成QString来存储,而字符是QChar(即unicode)
查看参数为常字符串的构造函数,可以看到它使用fromUtf8()函数将我们输入的字符串(Utf-8)转换成unicode字符串。即在构造函数中,进行了编码方式转换。
如果在不同的系统中,不经过编码转换将会发生乱码。
例:
将设置虚拟机与宿主机的共享文件夹,将QT下昨天编写的源文件拷贝到Linux的共享文件夹下,用在Windows下用记事本打开,再点击另存为,可以看到默认的编码方式默认为UTF-8,将其修改为ANSI(GBK编码),保存并替换,此时编码方式已经改变为GBK编码。回到Linux将共享文件替换原来的源文件。再编译将出现执行可执行程序,将出现乱码现象。GBK的编码使用fromUtf8()函数无法完成正常转换。
注意:
不同的编码方式,对中文的影响较大,因为中文的字符个数较多。但是英文基本不受编码方式影响。
2、手动编码方式转换
(1)QTextCodec类(最后一个字母是转换的缩写,即文本编码转换)
(2)实例
...表示当前编辑器默认的编码方式,这里为KOI8-R。也可以直接将字符串放在第三行的参数中
第二句表示获取一个KOI8-R的对象
第三句表示将这种编码的字符串转换为unicode编码
如果是想将GBK编码转换为unicode编码,只需将KOI8-R替换为GBK即可。
注意:
在QT5中,QString内部可以通过类型转换构造函数,将utf8编码自动转换成unicode编码。其他编码需要手动转换为unicode。
二、信号和槽
1、基本概念
信号和槽是QT自行定义的一种通信机制,实现对象之间的数据交互。如:实现点击按钮,关闭标签。
其本质就是函数的调用,一个信号发出,连接到该信号的槽函数将被执行。
2、定义方式
class xx{
Q_OBJECT//元对象编译器,使不符合标准C++的语法转换成符合标准C++的语法
signals://QT中定义的关键字
void sig_func(..);//信号函数
public slots://slots为QT中定义的关键字
void sig_func(...);//槽函数
};
3、建立信号和槽的连接
使用如下的函数,它是一个静态成员函数。信号连接发生在运行期间,这一点需要注意。
QT提供两个宏可以将信号函数或者槽函数转换为const char*指针:
SIGNAL(信号函数);//将信号函数转换为const char*
SLOT(槽函数);//将槽函数转换为const char*
参数:
sender:信号发送的指针
signal:信号函数
receiver:信号接收的对象指针
method:槽函数
#include<QApplication> #include<QLabel> #include<QPushButton> #include<QObject> int main(int arg,char* argv[]){ QApplication app(argc,argv); QLabel label("Hello QT!"); QPushButton button("关闭标签"); label.show(); button.show(); //连接信号和槽函数 QObject::connect(&button,SIGNAL(clicked()),&label,SLOT(close())); return app.exec(); }
练习:
实现点击按钮,关闭应用
思路:在帮助文档中查找QApplication及其基类相关可以退出或者关闭的函数,可以查找到:
void closeAllWindows();
和上一层基类中的
void quit();
#include<QApplication> #include<QLabel> #include<QPushButton> #include<QObject> int main(int arg,char* argv[]){ QApplication app(argc,argv); QLabel label("Hello QT!"); QPushButton button("关闭标签"); label.show(); button.show(); //连接信号和槽函数 QObject::connect(&button,SIGNAL(clicked()),&app,SLOT(closeAllWindows())); // QObject::connect(&button,SIGNAL(clicked()),&app,SLOT(quit())); return app.exec(); }
4、信号和槽函数连接的语法要求
1)一般信号和槽函数参数顺序和类型要相同
QObject::connect(&button,SIGNAL(sig_func(int)),&app,SLOT(slot_func(int)));//ok QObject::connect(&button,SIGNAL(sig_func(int)),&app,SLOT(slot_func(int,string)));//error
2)信号函数和槽函数可带有缺省参数
QObject::connect(&button,SIGNAL(sig_func(int)),&app,SLOT(slot_func(int,string="")));//ok
3)信号函数的参数可以多于槽函数
QObject::connect(&button,SIGNAL(sig_func(int,string)),&app,SLOT(slot_func(int)));//ok多于的参数将被忽略
4)一个信号可以连接到多个槽函数,信号发生时,都会被执行
QObject::connect(&button,SIGNAL(sig_func(int)),&app1,SLOT(slot_func1(int)));//ok QObject::connect(&button,SIGNAL(sig_func(int)),&app2,SLOT(slot_func2(int)));//ok
5)多个信号可以对应同一个槽函数,无论谁发了信号,槽函数都会被执行
QObject::connect(&button1,SIGNAL(sig_func1(int)),&app,SLOT(slot_func(int)));//ok QObject::connect(&button2,SIGNAL(sig_func2(int)),&app,SLOT(slot_func(int)));//ok