Qt 编程入门笔记(一)

1. QMainWindow/QWidget/QDialog的区别

  • QMainWindow是带有菜单栏窗口的基类,一般用于PC端。
  • QWidget是Qt所有控件的基类,是普通窗口。
  • QDialog是对话框的基类。它们都是Qt的基类,没有从属关系,只是创建的GUI属性不一样。

2.Qt的基本框架

// QApplication应用程序类
//Qt头文件没有.h,头文件和类名一样
#include 

int main(int args,char** argv)
{
    //有且只有一个应用程序类的对象
    QApplication app(args,argv);
    
    //下面是coder自定义代码(创建窗口对象并显示等等)
    
    
    //让程序一直执行,等待事件发生
    app.exec();
    return 0;
}

3.Q_OBJECT宏

  • 当一个类中需要利用信号或槽机制进行通讯时,必须在该类定义中包括该宏。
  • 一般是在类所对应的头文件中的类定义里的第一行写上Q_OBJECT即可。

4.指定父对象

       不指定父对象,则各个窗口是相互独立的;a指定其父对象为b,则a显示在b界面上,还有就是b显示则a自动显示(不需要手动写a.show()).

       (1) setParent()  子类对象调用setParent()方法; b. setParent(&a)  

       (2)构造函数传参 子类对象创建时传入父类指针。&b=new B(&a)

  • 指定和不指定父对象的区别:
  • 指定父对象的方法:

5.信号与槽

        信号与槽通过connect()函数实现绑定的,其本质是Qt对象之间的信号传递。

  •  connect函数
//Qt 5.x
connect(&objSend,&A::fun1(),&objReceive,&B::fun2())

//objSend 信号发送者
//A::fun1() A类的信号函数
//objReceive 信号接收者
//B::fun2()  B类的槽函数,用于处理信号

/*------------------------------------------------------------*/
//Qt 4.x
connect(&objSend,SIGNAL(fun1()),&objReceive,SLOT(fun2()))

//SIGNAL SLOT 是宏定义,没有类型检查,安全性差
  •  自定义信号:

        (1) 信号必须用关键字signals来声明;
        (2) 信号函数的返回值为void,但可以有参数;
        (3) 信号就是函数声明,只需声明,无需定义;
        (4) 使用:emit mySignal(int sendBus)。

//在类里面声明
signals: 
    void mySignal(int sendBus);


//在某个函数里发送信号
emit mySignal(int sendBus);
  • 自定义槽:

       Qt 5.x 槽函数就是普通函数(成员函数,全局函数,静态函数等),Qt 4.x 槽函数必须加关键字slots;

//Qt 4.x
public slots:
    void fun();

       槽函数需要与信号一致,带参数的信号函数会把其参数值传递给槽函数形参(参数和返回值相同),由于信号返回值为void,所以,槽函数一定没有返回值。

  • C++11增加新特性:lambda表达式(匿名函数)
connect(&objSend,signalFunction,
         []()                      
         {
            //to do

         })


//例1
connect(&objSend,signalFunction,
         [=]()                           //表示外部变量可读   
         {
            //to do

         })

//例2
connect(&objSend,signalFunction,
         [=]() mutable                   //表示外部变量可读可写   
         {
            //to do

         })

         该方法需要在项目文件.pro里添加 “CONFIG +=C++11”;

         []里一般写“=”表示lambda函数体里可以读取外部变量值,()里是函数参数,{}里是函数体。

6.Qt的坐标系统

  • Qt 的坐标原点在左上角,Qt控件的参考系是其父对象。
  • Qt 的独立窗口(没有父对象的ui)其参考系是显示屏。

7.内存回收机制

      Qt 支持内存自动回收,主要指的是堆上分配的对象,不需要用delete进行手动释放。

      也许,很多人不知道Qt 、java的垃圾自动回收机制,其实,想法都类似:简单来说,每当new一个对象就将其分配的COUNT引用计数加1,每次delete一个对象之前检查它的COUNT是否为0,当COUNT==0时就执行delete,否则不执行。

 

 

你可能感兴趣的:(Qt)