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

12 篇文章 2 订阅

一、新增自定义子类并在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中可以找到。如下图:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用C++ class来自定义Qt控件。以下是一些步骤: 1. 创建一个新的Qt控件项目。 2. 添加一个新的,它将是你自定义控件的基。 3. 在这个添加你想要的属性、方法和信号/槽。 4. 重写paintEvent()函数,以便绘制你的控件。 5. 在你的项目使用你的自定义控件,就像使用其他Qt控件一样。 下面是一个简单的例子,展示了如何使用C++ class来创建一个自定义的Qt控件: ```cpp // MyCustomLabel.h #ifndef MYCUSTOMLABEL_H #define MYCUSTOMLABEL_H #include <QLabel> class MyCustomLabel : public QLabel { Q_OBJECT public: MyCustomLabel(QWidget *parent = nullptr); ~MyCustomLabel(); void setText(const QString &text); protected: void paintEvent(QPaintEvent *event) override; private: QString m_text; }; #endif // MYCUSTOMLABEL_H ``` ```cpp // MyCustomLabel.cpp #include "MyCustomLabel.h" #include <QPainter> MyCustomLabel::MyCustomLabel(QWidget *parent) : QLabel(parent) { } MyCustomLabel::~MyCustomLabel() { } void MyCustomLabel::setText(const QString &text) { m_text = text; update(); } void MyCustomLabel::paintEvent(QPaintEvent *event) { QLabel::paintEvent(event); QPainter painter(this); painter.drawText(rect(), Qt::AlignCenter, m_text); } ``` 在这个例子,我们创建了一个新的MyCustomLabel,它从QLabel继承而来。我们添加了一个setText()方法,它保存了一个字符串,并在控件被绘制时显示该字符串。在paintEvent()函数,我们使用QPainter来绘制字符串。 要在你的项目使用这个控件,你可以在Qt Designer中将其拖放到你的界面上,或者在代码使用它: ```cpp // main.cpp #include <QApplication> #include "MyCustomLabel.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MyCustomLabel label; label.setText("Hello, world!"); label.show(); return a.exec(); } ``` 这里我们创建了一个MyCustomLabel实例,设置了它的文本,然后显示了它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值