QT学习笔记

本博文只记录看书时没有及时消化或觉得需要记忆的知识点。

QT中每一个类,都有一个与其同名的头文件,QObject::tr()函数可以实现多语言支持,建议程序中所有要显示到界面上的字符串都使用tr()函数括起来。

QWidget的构造函数有两个参数:一个指定父窗口部件,一个是Qt::WindowFlags类型,指定各种窗口系统属性。

QWidget::setWindowState():用来设置窗口的状态,包括最大化,最小化,全屏状态。

要想使一个对话框成为模态对话框,只需要调用它的exec函数即可,使用show是建立非模态对话框,其实使用show函数也可以建立模态对话框,只须在前面使用setModal()函数即可,但是它与用exec函数时的效果是不一样的,后者虽产生一个模态对话框,但是调用完show函数后会立即将控制权交给调用者,程序可以往下执行,而调用exec函数却不同,只有当对话框被关闭时才会返回。

QT Creator设计了一个快速添加定义的方法,单击类定义里的方法声明,同时按下alt+enter键,也可以在函数中右击,在弹出的级联菜单中选择Refactor菜单项,就可以在对应的cpp文件中添加方法函数定义,这个跟在visual studio中visual assist功能在头文件的方法声明中添加对应CPP的函数定义一样。

事件是先传递给指定窗口部件的,确切的说应该是先传递给获得焦点的窗口部件,但是如果该部件忽略掉该事件,那么这个事件就会传递给这个部件的父部件。

如果一个Widget部件A包含一个子部件B,对部件B进行操作时,则事件的传递顺序是这样的,先是Widget部件A的事件过滤器eventFilter(),然后是焦点部件B的event()函数,最后是焦点部件B的具体事件处理函数,如果焦点部件B在事件处理函数中忽略了该事件ignore,那么会执行父部件A的事件处理函数。

QT中提供了事件过滤器来实现在一个部件中监控其他多个部件的事件,事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视。这两个函数分别是installEventFilter()和eventFilter(),都是QObject类中的函数。要对一个部件使用事件过滤器,那么就要先使用其的installEventFilter()函数为其安装事件过滤器,这个函数的参数表明了监视对象。例如ui->textEdit->installEventFilter(QObject* filterObj);这条语句表示在filterObj对象中监视textEdit部件对象的事件。使用事件过滤器可以很容易地处理多个部件的多个事件,如果不使用它,那么就得分别子类化各个部件,然后重新实现它们对应的各个事件处理函数,非常麻烦。

在一个Widget部件中,默认是当按下鼠标按键时移动鼠标,鼠标移动事件才会产生,如果想不按鼠标按键也可以获取鼠标移动事件,那么就要在Windget构造函数中开启窗口部件的鼠标跟踪功能:setMouseTracking(true).

声明一个信号要使用singnals关键字,在singnals前面不能用public,private和protected等限定符,因为信号默认是public函数,声明槽可以使用slots关键字,其实也不一定要使用slots 声明槽函数,因为QObject::connect()函数有多个重载形式,当接收执行槽函数的参数是const char*类型时,所对应的槽函数一定要用slots关键字声明,并用SLOT()宏将其转化为const char*  类型,且用SLOT宏包含内的槽函数的参数只能有参数类型,不能有变量名,例如SLOT(ShowValue(int)),当接收执行槽函数的参数是PoinerToMemberFunction类型时(即另一种重载形式),则所对应的槽函数不再必须使用slots关键字声明的函数,而且并不要求该函数拥有的参数类型与信号中对应的参数类型完全一致,只需要可以进行隐式转换即可,例如&Widget::ShowValue,且这里不再写出函数参数类型,一个槽可以是 public,private和protected类型的,槽也可以被声明为虚函数,这与普通的成员函数是一样的,槽的最大特点就是可以与信号关联。

使用信号与槽需要注意以下几点:

(1)需要继承自QObject或其子类;

(2)在类声明的最开始处添加Q_OBJECT宏,一般文件内已经自动添加好;

(3)槽中参数类型要和信号参数的类型相对应,且不能比信号的参数多;

(4)信号只有声明,没有定义,且返回值为void类型。

QObject::connect()函数的最后一个参数是由Qt::ConnectionType枚举类型指定,其默认值是Qt::AutoConnection,编程中一般使用默认值,使用emit发射了信号之后就会立即执行槽,只有等槽执行完了之后都会执行emit语句后面的代码,如果将参数改为Qt::QueuedConnection,这样在执行完emit语句后便会立即执行其后面的代码,而不管槽是否已经执行完毕。

将一个包含其它部件的布局管理器应用到某窗口上时,那么该布局管理器和其中所有部件都会自动将它们的父部件parent转换为该窗口部件。


猜你喜欢

转载自blog.csdn.net/zhouchunyue/article/details/79577882
今日推荐