QT的一些小知识

1.QString

QString filename="学习资料";
QString filesize="1T";
QString  filepass="没有";
QString text=QString("我有一份 %1,他的大小为 %2,他的密码为 %3!").arg(filename).arg(filesize).arg(filepass);
qDebug()<<text<<endl;

输出结果:我有一份学习资料,他的大小为1T,他的密码为没有! 

2.bin文件与hex文件

     bin文件在文件中依旧是以无符号字节方式存储,只有数据内容,如果是汇编生成的烧写bin文件,那么每一个字节对应一个程序中的flash字节。

      hex文件在文件中也是无符号字节方式存储,如果是烧写hex文件,那么它包含烧写的地址,每个地址中烧写的数据。

在QT中使用QDatastream来读取或者写入。

3.txt文件

  这个就是字符文件,因为字符没有0xFF(-1),所以,一般以-1表示文件结束eof。

  读取方式有QTextStream和QFile两种读取字符文件的方式。

4.文件存储的总结,文件都是以字节为单位的方式存储,根据编码方式的不同决定每个数据所占据的字节个数,bin,hex都是一个数据占据一个字节,ASCII码就是一个数据比如“a”这个字符就占据一个字节,Unicode(万国码)包含了所有的符号,‘我’用2个字节存储,‘a’用一个字节存储,所以需要解码。bin文件hex文件的一个数据为“0xff”,ASCII码的一个数据为‘$’(0x24),万国码的一个数据为‘我’(\u6211),\u表示unicode,后面为两个字节。bin文件,hex文件读出来就可以使用,不需要解码,如果要是显示,需要将字节数据转换成字符串数据。而utf,Unicode等显示需要查字库。

5.字符与字节

   字节一个2位16进制数,字符,一个人为定义的符号。字节的大小为0~255,字符可以与字节互转。字符转字节需要注意大小写。数据格式不一样进行计算一定要先判断有无符号位再去转换格式计算,先转换符号,再对齐计算。

6.再次回头了解一下qt的自动生成文件。

//分清楚它的命名空间,一个默认空间,一个UI空间
QT_BEGIN_NAMESPACE
namespace UI {class MainWindow;}//告诉你可以调用官方UI空间的界面类
QT_END_NAMESPACE
//类的声明
class MainWindow : public QMainWindow//此处的MainWindow是默认空间,与上面的不是同一个类
{
    Q_OBJECT  //宏定义,meta_system 中表明它有自己的信号槽服务能力,没有它信号槽会报错
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;//UI中的MainWindow指针,它与上面继承的不是同一个类
}
//cpp,列表初始化构造函数
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)//给指针parent分配一个空间
    , ui(new Ui::MainWindow)  //给头文件中的ui指针分配一个空的窗体应用界面
{
    ui->setupUi(this);//给ui初始化一个界面
}
//总结:
   一直有一个误区,就是ui界面如何与代码联系起来的,android中的view.findviewbyid绑定控件,android中又有一种bind的新方法,更加好用,但是在QT中是直接调用的绘画函数。
流程是我在mainwindow.ui中设计完界面,会生成一个xml文件,然后会解析xml文件,通过ui->setupUI(this),调用解析xml然后自动生成绘制画面的函数类就是UI::MainWindow,然后在main中调用show方法显示。而我们的ui指针绑定了UI::MainWindow,所以我们可以通过ui->lable->setText("good study");来在代码中进行界面交互。
    

7.中文乱码的解决方法

....
Qstring str="你好";//发现他显示的时候是乱码
//原因:没有指定字符串的编码格式,按照默认的latin1来的
//解决办法,声明字符串的编码器格式和将字符串主动翻译
//声明编码格式
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))
//主动翻译
QObject::tr("你好");
//主动翻译是有单价的,因为他是要调用翻译包的。所以建议直接设置字符串的编码格式。

8.上面有一个类QTextCodec,那么这个类是qt提供给我们进行字符串编码格式转换的:

std::string utf8togb2312(std::string utf8_str){
//定义两个文本类
QTextCodec *utf8code=QTextCodec::codecForName("utf-8");
QTextCodec *GB2312code=QTextCodec::codecForName("gb2312");
//将编码转成统一万国码
	QString strUnicode = utf8Codec->toUnicode(utf8_str.data());        //无编码
//从万国码转成GB2312编码
	QByteArray gb2312= gb2312Codec->fromUnicode(strUnicode);       //无编码转换
//返回GB2312的编码字节
    return std::string(gb2312.data());
}
//编码格式都是以这个为模板互转的
//记得在main函数中设定字符串编码器格式,这样中文就不会乱码,latin编码是qt默认编码,其实就是ascii,没有中文,所以中文显示输出乱码。
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

    国标码:GBK,GB2312,GB18030等等。

   万国码:unicode,UTF-8,UTF-16,UTF-32等等

   还有神马big5,cp94等等。

    GBK:21000多个汉字,GB18030有18000多个汉字,GB2132有6千多个汉字。2字节存储,彼此兼容,但是与unicode不兼容,需要转换。

  unicode:万国码存储方式为1个字节到四个字节不定,有自己独特的编码格式。

注意:文件存储一般不用GB2312,用GBK,应为GB2312汉字字数不全。

9.简单谈一下qt与arm 嵌入式的显示问题

     1.lcd液晶显示需要驱动,显示的单位是帧,framebuffer就是存放显示的帧地方.

     2.应用层如何操作驱动和freamebuffer呢?这就诞生了一个应用层的库,tslib。它将显示和触摸全部封装成标准方法,供其它程序调用。

     3.qt带有显示的程序想要在arm 板子上跑起来,需要两件事;

           安装tslib库,qt arm是直接调用这个应用层库来显示ui的。

           交叉编译arm环境的qt程序,毕竟移动端arm架构和电脑x86是两种不同的架构,许多方面不兼容。 

10.发布到没有qt的计算机运行

         1.编译生成release版本程序

         2.进入生成的release文件夹复制.exe文件

         3.将其粘切到你新建需要copy出去的文件中,此文件就是你给别的电脑安装的程序文件。

         4.打开qt的命令行工具,点击键盘windows,找到qt的cmd工具。

         5.进入到你复制的可执行文件的文件夹中  cd  d:/mytest  /r

         6.执行 windeployqt myTest.exe /r 命令,会自动添加程序依赖。

        7.执行完成后就可以把文件夹copy出去,然后相应的电脑点击.exe就可以正常运行了。

小技巧,ctrl+鼠标点击类名会跳转到定义奥。函数也是一样奥!F1是查官方文档,一个查源码,一个查官方文档,双剑合璧,奇功自废。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值