QT新增自定义控件类并在QT Designer中将系统父类替换

一、新增自定义子类并在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
#include

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下方新增了相关的头文件引用。如下图:

QT新增自定义控件类并在QT Designer中将系统父类替换_第1张图片

3、在自动生成的mainwindow.h头文件中,可以看到自动添加了

#include 

二、mainwindow.ui 和设计器界面,以及ui_mainwindow.h的关系

1、mainwindow.ui

首先上传代码仓库的实际上就是mainwindow.ui文件,本质上为一个xml文件,内部包含了ui布局生成的逻辑关系。如下图:

QT新增自定义控件类并在QT Designer中将系统父类替换_第2张图片

 qt designer 设计器界面上,实际上是加载了这份ui文件而生成的可操作界面。我们可以直接修改设计器界面,也可以修改mainwindow.ui这个文件。实际的修改都会被上传到代码仓库。

2、ui_mainwindow.h

这个文件实际上就是将mainwindow.ui转换成了c++代码,以头文件的形式展示。是一份临时文件,会被用来编译生成最终程序的。

它是不会出现在代码仓库中的,每次我们修改.ui之后,重新编译都会新生成一分.h,在工程目录中的debug/release中可以找到。如下图:

QT新增自定义控件类并在QT Designer中将系统父类替换_第3张图片

你可能感兴趣的:(QT,IDE,qt)