一、新增自定义子类并在QT Designer中将系统父类修改掉
qt中经常会遇到系统提供的UI控件类无法满足使用要求,因此需要自定义相关的类。
一般步骤为:创建自定义类,继承系统类。
此时分为两种情况,若是直接在cpp中书写布局的方式,那么直接使用该自定义类即可。
若是已经在qt designer中布局好了,那么需要通过修改qt designer中的类来达到目的。
本文主要阐述这种方式。
以QTreeWidget为例,我需要新建一个自定义类名为LNTreeWidget。在默认的MainWindow.cpp/h/ui中,已经使用了大量的QTreeWidget。
1、首先,对QtreeWidget做一个自定义封装,创建一个自定义子类LNTreeWidget继承自QtreeWidget:
#ifndef LNTREEWIDGET_H
#define LNTREEWIDGET_H
#include<QTreeWidget>
#include<QEvent>
class LNTreeWidget:public QTreeWidget
{
public:
LNTreeWidget(QWidget *parent = nullptr);
protected:
void enterEvent(QEnterEvent *event) override;
void leaveEvent(QEvent *event) override;
};
#endif // LNTREEWIDGET_H
重载了enterEvent和leaveEvent,鼠标移入移出事件,在cpp中做对应处理(这里是自定义的逻辑,不是本文重点,不再赘述)
2、修改mainwindow.ui 文件,即在qt 设计器的UI界面中修改。
选择Qtreewidget控件,右键菜单->提升为
然后在弹窗的“提升的类名”输入框中输入LNTreewidget,如下图:
点击“提升”,即可生效。也就是说在mainwindow中的qtreewidget实际上已经被替换成了LNTreewidget。
而我们需要自定义的一些行为,直接在LNTreewidget.h/cpp中自己实现即可。
此时,qt帮我们做了几件事:
1、mainwindow.ui 文件中自动将qtreewidget节点修改为了LNTreewidget。
2、mainwindow.ui下方新增了相关的头文件引用。如下图:
3、在自动生成的mainwindow.h头文件中,可以看到自动添加了
#include <lntreewidget.h>
二、mainwindow.ui 和设计器界面,以及ui_mainwindow.h的关系
1、mainwindow.ui
首先上传代码仓库的实际上就是mainwindow.ui文件,本质上为一个xml文件,内部包含了ui布局生成的逻辑关系。如下图:
qt designer 设计器界面上,实际上是加载了这份ui文件而生成的可操作界面。我们可以直接修改设计器界面,也可以修改mainwindow.ui这个文件。实际的修改都会被上传到代码仓库。
2、ui_mainwindow.h
这个文件实际上就是将mainwindow.ui转换成了c++代码,以头文件的形式展示。是一份临时文件,会被用来编译生成最终程序的。
它是不会出现在代码仓库中的,每次我们修改.ui之后,重新编译都会新生成一分.h,在工程目录中的debug/release中可以找到。如下图: