QT-编码方式,信号和槽,容器窗口与事件同步,面向对象的QT编程(day2)

一、编译方式

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(intstring)));//error
 

2)信号函数和槽函数可带有缺省参数

QObject::connect(&button,SIGNAL(sig_func(int)),&app,SLOT(slot_func(intstring="")));//ok


3)信号函数的参数可以多于槽函数

QObject::connect(&button,SIGNAL(sig_func(intstring)),&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

猜你喜欢

转载自www.cnblogs.com/ptfe/p/11312841.html