Qt6教程之三(3) QtWedget自定义控件

2023-11-14

在之前的博客中,我们使用的控件都是Qt官方提供的,对于控件的特性也只能被动地接受,为了打破这种束缚,可以按照自己的想法来定义控件。

不过自定义控件必须遵守Qt官方的一套自定义控件规则,在规则之下我们就可以定义属于我们自己的控件啦!

QWidget是所有控件的基类,在自定义控件时均需要继承QWidget,然后通过重写覆盖原有方法或属性的方式来达到自定义控件的目的。

博主对于自定义控件的相关技术掌握程度略浅,这里针对自定义控件仅有两种方法,一种是基于Qt设计师的提供的控件提升方式,这种方式可以对多个控件进行组合,形成一个可复用的新控件;

另一种是纯代码实现方式,这种一般是继承Qt的原生控件,如push button,然后重写里面的对应函数来实现自己想要的功能,下面将对两种方式进行逐一演示。

话不多说,开始上代码:

一 基于Qt设计师的控件提升方式实现自定义控件

打开 Qt Qcreator ,新建一个应用程序工程,步骤如下:

 

项目名称叫WidgetTest ,创建路径根据自己的实际需求选择即可,点击下一步:

 

 

 

 

 

点击完成后,项目创建成功,

 

接下来添加一个UI页面作为自定义控件使用,下面我们采用水平进度条+LCD Number控价组合来作为一个自定义控件,步骤如下:

鼠标右键工程名称,选择添加新文件,

 

 

 

点击完成后,页面创建成功,

 

在左侧拖入两个控件: 水平进度条、LCD Number,布局如下:

然后点击左侧的编辑按钮,找到widget.ui 文件,双击打开,

 

找到widget控件,拖入UI编辑器,

选中拖入的widget控件,鼠标右键,选择提升为 ,

 

填入类名,选择添加,

 

然后勾选全局包含,点击提升,

 

此时可以看到,widget控件已被提升为 MyWidget,

 

 此时,运行程序后,我们之前在MyWidget.ui里面添加的控件就会在widget.ui的widget控件里面显示了,

 

接下来我们实现圆盘与进度条的相互联动功能(当拖动进度条时圆盘转动,当转动圆盘时进度条走动);

在MyWidget.h中新建四个属性函数,分别用于设置和获取圆盘与进度条的值,

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();


    //四个public 属性函数,分别用于设置和获取圆盘与进度条的值
    void setDialValue(int value);
    int getDialValue();

    void setSliderValue(int value);
    int getSliderValue();

private:
    Ui::MyWidget *ui;
};

#endif // MYWIDGET_H

MyWidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    ui->dial->setMaximum(100);
    ui->dial->setMinimum(0);
    ui->dial->setPageStep(1);

    ui->horizontalScrollBar->setMaximum(100);
    ui->horizontalScrollBar->setMinimum(0);
    ui->horizontalScrollBar->setPageStep(1);



    connect(ui->dial,SIGNAL(valueChanged(int)),ui->horizontalScrollBar,SLOT(setValue(int)));
    connect(ui->horizontalScrollBar,SIGNAL(valueChanged(int)),ui->dial,SLOT(setValue(int)));

}

MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::setDialValue(int value)
{
   ui->dial->setValue(value);
}

int MyWidget::getDialValue()
{
   return ui->dial->value();
}

void MyWidget::setSliderValue(int value)
{
   ui->horizontalScrollBar->setValue(value);
}

int MyWidget::getSliderValue()
{
  return ui->horizontalScrollBar->value();
}

接下来在主程序页面 widget.ui中添加两个按钮,用于设置和获取进度条的值,实现基础控价的属性设置功能;

 

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void setSliderValue();
    void getSliderValue();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->setBT,SIGNAL(clicked()),this,SLOT(setSliderValue()));
    connect(ui->getBT,SIGNAL(clicked()),this,SLOT(getSliderValue()));

}

Widget::~Widget()
{
    delete ui;
}

void Widget::setSliderValue()
{
ui->widget->setSliderValue(ui->setSP->value());
}

void Widget::getSliderValue()
{
  ui->getSP->setValue(ui->widget->getSliderValue());
}

运行效果:

点击圆盘或进度条时二者可以联动,对进度条进行设置时,进度条能够走到指定的位置,也能获取当前进度条的实时位置;

 

二 纯代码实现方式实现自定义控件

这里有一个比较优秀的博客介绍,绘制漂亮的仪表盘,博客链接如下 :

Qt自定义控件之仪表盘的完整实现_qt 仪表盘_特立独行的猫a的博客-CSDN博客基于QT的仪表盘有很多种办法,比如使用QWT或Echart组件,或者基于QT的绘图功能绘制,或者基于美工提供的图片的基础上增加动态效果。然而搞明白QT自定义控件的绘图后,这种实现是最简单的。且定制度高,想要什么效果就可以自己绘制个。这里介绍下Qt自定义控件之仪表盘的完整实现。https://blog.csdn.net/yyz_1987/article/details/126958420?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-126958420-blog-78699591.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-126958420-blog-78699591.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=6绘制效果:

另外还有一个时钟的博客:

QT自定义控件--时钟_qt 时钟_贝勒里恩的博客-CSDN博客注:由于本人绘图刚刚开始学,所以还存在一些瑕疵,但是对于小白入门QT绘图还是很有帮助的。一、效果展示二、绘制原理详解1、绘制时钟盘首先我们需要确定绘制一个时钟表盘需要哪些参数,在此我把黑色圆环称为外部,白色圆称为内部。绘制时钟表盘我们需要确定时钟的中心(Center_pos)、外部表盘的半径(R_Edge)、内部表盘的半径(R_Inside)、圆心指针端点小圆半径(R_Pointer)...https://blog.csdn.net/Mr_robot_strange/article/details/104982649?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167791943916782427455342%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167791943916782427455342&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3-104982649-null-null.142^v73^pc_search_v2,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=QT%E8%87%AA%E5%AE%9A%E4%B9%89dial%E6%8E%A7%E4%BB%B6&spm=1018.2226.3001.4187 

 

上一篇博客:Qt6教程之三(2) QT使用qss_爱折腾的业余程序员的博客-CSDN博客本篇主要介绍Qt的QSS技术!https://blog.csdn.net/XiaoWang_csdn/article/details/129259335

下一篇博客:

Qt6教程之三(4) 页面控件布局_爱折腾的业余程序员的博客-CSDN博客主要介绍Qt的控件布局,包括单布局、嵌套布局的示例!https://blog.csdn.net/XiaoWang_csdn/article/details/129336845?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129336845%22%2C%22source%22%3A%22XiaoWang_csdn%22%7D

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt6教程之三(3) QtWedget自定义控件 的相关文章

  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • 使用 QWT 构建时出错

    我收到一个错误 undefined reference to QwtPlot QwtPlot QWidget 当我尝试构建我的项目时 即使设置中一切看起来都很好 在我的 CmakeLists txt 中我有 include director
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht

随机推荐

  • c++中如何只保留float型的小数点后两位

    float spd 22 518744 char buf 10 sprintf buf 2f spd sscanf buf f spd 记录一下 有时候我们需要float类型只保留两个有效小数 但是在实际应用中会发现一些现象 如 1 5 在
  • 这个 17 岁的黑客天才,破解了第一代 iPhone!

    关注 星标公众号 直达精彩内容 时间来到2007年 第一代的ipone问世惊艳了世人 重新定义了智能手机 但第一代的iPhone也有让人恼火的地方 当时的iPhone和AT T 当时美国最大的移动运营商 签了五年的独家运营协议 使得网络只局
  • redmine Email delivery error: Net::ReadTimeout

    好吧 创建一个redmine 在配置邮件的时候sendmail 可以通过 smtp 25端口可以通过 但使用SSL465 端口说什么也过不去 报错Email delivery error Net ReadTimeout 找样例找不到 有关于
  • 支付宝支付整体流程,包括验签【同步】【异步】

    一 前期准备 1 支付宝开放平台沙箱账号 用于测试 应用公钥需要使用支付宝第三方工具生成 最好在本地备份好 公钥以及配对的密钥 2 javasdk的maven仓库 javasdk 3 内网穿透 使内网能够被 支付宝的服务器访问 支付成功后支
  • java中常见异常

    为了以后方便查阅 特将java中常见异常记录下来 java lang ArithmeticException 算术条件异常 譬如 整数除零等 java lang ArrayIndexOutOfBoundsException 数组索引越界异常
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • Spring源码分析六:bean的创建④ - createBeanInstance

    文章目录 一 前言 二 createBeanInstance 概述 三 createBeanInstance 详解 1 调用 Supplier 接口 obtainFromSupplier 2 使用 factory method 属性 ins
  • php uncaught thrown,PHP异常详解

    PHP的异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法 异常处理用于在指定的错误 异常 情况发生时改变脚本的正常流程 这种情况称为异常 一般使用方法 php this gt getMessage is not a valid
  • flex学习 ------- 复写treeItemrenderer 给树形菜单加复选框

    项目中菜单树 复选框的需求 以为像平常的list控件加个itemrender就可以搞定 谁知道不是那么回事 果断baidu 看到有大神写过 果断看tree的源码 发现 tree在构造函数中已经默认设置了一个itemrnederer 而且它的
  • 【PMSM控制】电流环带宽

    带宽的概念 可以理解为是频率 在自控的定义上来说 即是规定3dB衰减或有90 相移作为带宽的评价标准 因为控制系统的性能可以用动态响应和稳态误差来评判 为了便于评判系统性能 从频域来考虑 就是都给100Hz变化的正弦信号 看系统的失真情况
  • 使用computed_VUE中computed计算属性和data数据获取的问题

    获取到数据 对象 数组 截取一部分显示到页面中 用computed计算属性来实现截取数据然后直接输出到页面 div class detailBox h1 class detailHead ActiveData title h1 div cl
  • c语言检测使用方法,一种基于程序切片技术的C语言死代码检测方法与流程

    本发明涉及恶意代码分析领域 主要涉及一种基于程序切片技术的C语言死代码检测方法 背景技术 随着互联网的广泛普及 现今的计算机网络也面临着越来越多的攻击威胁 在众多网络安全问题中 恶意代码所造成的安全危害愈发严重 恶意代码分析成了安全人士关注
  • 机器学习西瓜书——第05章神经网络

    本文是关于周志华老师编写的机器学习书籍 西瓜书 的第五章神经网络 主要的内容有 M P神经元模型的构成 简单感知机和多层网络 以及著名BP算法的推导过程 激活函数是Sigmoid 文章目录 5 1 神经元模型 工作过程 激活函数 5 2 感
  • [Filco]蓝牙连接键盘

    第一次用蓝牙键盘 断连后的重连太痛苦了 蓝牙里搜不到键盘 搜到了PIN码不知道输入什么 不输入PIN码连接 Filco方法 控制面板 设备和打印机 点击 添加设备 搜索到 Filco 点击下一步 尝试从设备输入 对着数字敲 然后Enter就
  • Docker之Alpine制作镜像且上传至阿里云

    Alpine制作jdk镜像 alpine Linux简介 Alpine Linux是一个轻型Linux发行版 它不同于通常的Linux发行版 Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗 alp
  • 8位深, 16位深,24位深,32位深图片显示原理及对比

    我们都知道一张图片可以保存为很多种不同的格式 比如bmp png jpeg gif等等 这个是从文件格式的角度看 我们抛开文件格式 看图片本身 我们可以分为8位 16位 24位 32位等 单击右键 属性 gt 详细信息即可查看图片位深度 8
  • ijkplayer-android编译 兼容多视频格式

    用的播放器框架是ijkplayer 然后就去https github com Bilibili ijkplayer的issue里找答案发现很多人遇到了这个问题 最终还是想通过编译定制化so的方式解决 践行解决方案 按照官方文档编译andro
  • Mybatis-代码走查问题整理

    实践篇 1 和 的区别 直接替换变量 有sql注入风险 使用场景 当表名 字段名作为变量传入时 PreparedStatement 预处理编译 先替换为 然后赋值 添加单引号 2 使用注解和xml文件sql的方式区别 注解 简单明了 无需额
  • Doris之Binlog Load

    Binlog Load Binlog Load提供了一种使Doris增量同步用户在Mysql数据库的对数据更新操作的CDC Change Data Capture 功能 适用场景 INSERT UPDATE DELETE支持 过滤Query
  • Qt6教程之三(3) QtWedget自定义控件

    在之前的博客中 我们使用的控件都是Qt官方提供的 对于控件的特性也只能被动地接受 为了打破这种束缚 可以按照自己的想法来定义控件 不过自定义控件必须遵守Qt官方的一套自定义控件规则 在规则之下我们就可以定义属于我们自己的控件啦 QWidge