自学内容网 自学内容网

QT开发笔记:信号和槽

乱码问题:

出现乱码问题原因只有一个:就是编码方式不匹配!!!
中文常见汉字4K,算上各种生僻字差不多六万字
仍然使用一个大表格,给每个汉字,分配一个整数即可。
字符集~~表示汉字的字符集,不同的字符集表示同一个汉字,使用的数字不相同。
目前表示汉字的字符集主要两种:
1、GBK (中国大陆)使用2个字节表示一个汉字,Windows简体中文版,默认GBK
2、UTF - 8/ utf8 变长编码。表示一个符号,使用的字节数有变化,2-4,但是在utf8中,一个汉字,一般是3个字节。
当前表示中文主流的方式还得是utf8(支持各种语言文字)
QT中提供了qDebug() 工具,借助在这里插入图片描述

MyLabel::~MyLabel()
{
    //std::cout << "MyLabel 被销毁!" << std::endl;  //打印出是乱码
    qDebug() << "MyLabel 被销毁!!";
}

这个直接能够处理乱码。
在这里插入图片描述
后续在Qt中,如果想通过打印日志的方式输出一些调试信息,都优先使用 qDebug,
Qdebug可以通过控制开关进行打印控制。

小结:
1、认识QLabel
2、内存泄露/文件资源泄露
3、对象树。QT中通过对象树统一释放对象
4、通过继承QT内置的类,就可以达到对现有控件进行功能扩展效果。
也可以重写控件中的任何功能,不仅仅是析构函数。
5、乱码问题 和 字符集
6、如何在Qt 中打印日志作为调试信息。qDebug(),具体宏搜一下。

Qt中的信号槽机制。
本质就是给按钮的剪辑操作,关联桑一个处理的函数。当用户电机的时候,就会执行这个处理函数。
connect(); linux网络编程中,也学过一个函数,叫做connect.这个函数用来给TCP socket 建立连接的。
写TCP。。。
QT中的connect是QObject这个类提供的静态函数。这个函数的作用就是“链接”信号和槽。

实际开发中,界面和代码构造男分主次!
如果你当前程序界面,界面内容是比较固定的,此时就会以同行画的方式来构造界面。
如果你的程序界面经常要动态变化,次十就会以代码的方式来构造界面。

QT中的命名规范;
/给变量/函数。起名:
1、描述性。
2、较长偏好使用_ 链接进行单词分割:蛇形命名法。
Qt中,偏好使用大写字母来进行单词分割:驼峰命名法。
具体使用哪种:入乡随俗。看公司使用什么风格。

QT坐标系
平面直角坐标系(笛卡尔坐标系):右手坐标系
计算机坐标系:左手坐标系 ,原点:左上角
给QT某个控件设置位置,就需要指定坐标,对这个空间来说,坐标系的原点就是相对父窗口/控件的。

QT信号与槽

  • 信号源:由那个控件发出的信号。
  • 信号的类型:用户进行不同的操作,就可能出发不同的信号。
  • 信号的处理方式:槽 =》函数 Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来。后续只要信号触发了,Qt就会自动执行槽函数。

Linux中
1、信号处理函数。
2、线程的入口函数。
3、

自定义信号和槽

  • 自定义槽函数比较关键,开发中大部分情况是需要进行自定义槽函数的,就是用户出发某个操作后进行的业务逻辑。
  • 自定义信号很少使用。
  • Widget 虽然还没定义任何信号,由于继承自QObject,也提供了一些信号了,可以直接使用。
  • QT5 以及更高版本中,槽函数和普通的成员函数之间没啥区别了。
  • 但是信号则是一类非常特殊的函数。这个函数的定义是QT在编译过程中自动生成的,过程无法干预。
  • 作为信号函数返回值必须是 void.
  • 信号定义关键字 : signals
    emit Signel();
    emit 发射 不仅可以发射自定义信号,QT内部信号也可以发射。

信号和槽 也可以带参数。
当信号带有参数的时候,槽的参数必须和信号的参数一致(类型和个数一致)。信号给槽的参数不能少!!!可以多。
所谓的信号槽,终究要解决的问题,就是响应用户的操作。信号槽其实在GUI开发的各种框架中,设计一个比较特色的存在。
其他的GUI来发框架搞得方式都更简单些,网页开发中相应用户操作主要是挂回调函数。
不需要搞一个单独的信号槽链接,处理函数就像控件的一个属性/成员一样(大部分GUI框架都是这样搞)。

Qt信号槽 connect机制设想:
1)解耦合。
2)多对多效果。一个信号可以connect到多个槽函数,一个槽函数也可以被多个信号connect。
实际开发中,多对多其实是个伪需求,实际开发中很少用到,绝大部分情况一对一就够用了。

补充:
1、使用 disconnect来断开信号与槽的链接。
2、定义槽函数的时候,也是可以使用lambda表达式。本质就是一个匿名函数,主要应用在

    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    connect(button,&QPushButton::clicked,this,[](){
         qDebug()<< "lambda 被执行了!!";

    });

}

lambda表达式是一个回调函数,这个函数无法直接获取到上层作用域中的变量的
lambda为了解决上述问题,引入了“变量捕获” 在 [想要捕获的变量]

    connect(button,&QPushButton::clicked,this,[button,this](){
         qDebug()<< "lambda 被执行了!!";
        button->move(300,300);
         this->move(100,100);
    });

如果当前lambda想捕获更多变量,使用 【=】,捕获所有变量。

    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    connect(button,&QPushButton::clicked,this,[=](){
         qDebug()<< "lambda 被执行了!!";
        button->move(300,300);
         this->move(100,100);
    });

如果后续我们的槽函数比较简单而且是一次性使用的们就经常会写作这种lambda的形式。
回调函数执行时机不确定,不确定


原文地址:https://blog.csdn.net/LIHONGLI000125/article/details/140447166

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!