QT自定义Widget控件及其使用

2023-11-03

今天来给大家分享一下QT自定义widget控件及其使用,当ui设计器提供的界面不满足实际需求时,可以从QWidget继承自定义的界面组件。有两种方法一种是提升法,另一种是ui设计器自定义界面组件widget组件。我们本次先说提升法。
通过这个简单的例子说明提升法
在这里插入图片描述
在这个窗体中,有一个label控件,一个horizontalSlider控件,以及一个自定义的电池控件。
1 为了设计这个电池控件,首先设计一个自定义的widget组件。
为此,设计一个从Qwidget中继承的类QmyBattery。创建C++类,点击QT Creator的File ->new file or project->C++ class,设置类名称为QmyBattery
以下是Qmybattrey.h中的代码:

#ifndef QMYBATTERY_H
#define QMYBATTERY_H

#include <QWidget>
#include <Qcolor>
#include <QRect>
class QmyBattery : public QWidget
{
    Q_OBJECT
private:
    //背景颜色
    QColor mColorBack=Qt::white;
    //电池边框颜色
    QColor mColorBorder=Qt::black;
    //电池柱颜色
    QColor mColorPower=Qt::green;
    //电池短缺颜色
    QColor mColorWarning=Qt::red;
    //电量0-100
    int mPowerLevel=60;
    //电量低警示阈值
    int myWarnLevrl=20;
protected:
    //后面的宏是为了声明对一个虚函数定义的方法
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
public:
    explicit QmyBattery(QWidget *parent = nullptr);
    //设置当前电池电量
    void setPowerLevel(int pow);
    int powerLevel();
    //设置电池电量低阈值
    void setWarnLevel(int warn);
    int warnLevel();
    //缺省大小
    QSize sizeHint();
signals:
    void powerLevelChanged();

public slots:
};

#endif // QMYBATTERY_H

下面是QmyBattery.cpp中的代码:

#include "qmybattery.h"
#include <QPainter>
#include <QPen>
//界面的绘制
void QmyBattery::paintEvent(QPaintEvent *event)
{
    //避免编译错误
    Q_UNUSED(event);
    QPainter painter(this);
    QRect rect(0,0,width(),height());
    //设置当前图形视图窗口
    painter.setViewport(rect);
    painter.setWindow(0,0,120,50);
    //抗锯齿的效果
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    QPen pen;
    pen.setWidth(2);
    pen.setColor(mColorBorder);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);
    QBrush brush;
    brush.setColor(mColorBack);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    rect.setRect(1,1,109,48);
    painter.drawRect(rect);
    brush.setColor(mColorBorder);
    painter.setBrush(brush);
    //电池头
    rect.setRect(110,15,10,20);
    painter.drawRect(rect);
    if(mPowerLevel>myWarnLevrl){
        brush.setColor(mColorPower);
        pen.setColor(mColorPower);
    }else{
        brush.setColor(mColorWarning);
        pen.setColor(mColorWarning);
    }
    painter.setBrush(brush);
    painter.setPen(pen);
    if(mPowerLevel>0){
        rect.setRect(5,5,mPowerLevel,40);
        painter.drawRect(rect);
    }
    QFontMetrics textsize(this->font());
    QString powStr=QString::asprintf("%d%%",mPowerLevel);
    QRect textRect=textsize.boundingRect(powStr);
    painter.setFont(this->font());
    pen.setColor(mColorBorder);
    painter.setPen(pen);
    painter.drawText(55-textRect.width()/2,23+textRect.height()/2,powStr);
}
void QmyBattery::setPowerLevel(int pow)
{
    mPowerLevel=pow;
    emit powerLevelChanged();
    repaint();
}

int QmyBattery::powerLevel()
{
    return mPowerLevel;
}

void QmyBattery::setWarnLevel(int warn)
{
    myWarnLevrl=warn;

    repaint();

}

int QmyBattery::warnLevel()
{
    return myWarnLevrl;

}

QSize QmyBattery::sizeHint()
{
    int H=this->height();
    int W=H*12/5;
    QSize size(W,H);
    return size;
}
QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent)
{

}

2 实现QmyBattery类之后,若用代码创建QmyBattery类对象,可以参考我的博文纯代码创建Qtpushbutton,我们在这用提升法实现
,首先在ui设计器中选择widget控件,鼠标右键点击提升为
在这里插入图片描述
点击添加

点击提升

3虽然界面上放置的QWidget组件提升为QmyBattery类,但是这个组件在建立信号是没有QmyBattery类的powerLevelChanged(int)信号,无法采用可视化实现信号的槽函数。
所以在主窗口放置一个label 和horizontalSlider控件,滑动标尺改变数值时,设置为当前电量值

void Dialog::on_horizontalSlider_valueChanged(int value)
{
   ui->widget->setPowerLevel(value);
   QString str=QStringLiteral("DL: ")+QString::asprintf("%d %%",value);
   ui->label->setText(str);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT自定义Widget控件及其使用 的相关文章

随机推荐

  • 求职经历,三轮技术面 +HR 面,面试也不过如此

    众所周知 阿里主要以 Java 为主 因此我投递的职位是 Java 高级 资深开发 我当时是在 Boss 直聘 App 上看到的职位 下图是当时的职位招聘信息 面试过程中注意策略 我求职的阿里的 Java 技术岗位一共有三轮技术面试和一轮
  • Python time和datetime时间戳和时间字符串相互转换

    Python time和datetime时间戳和时间字符串相互转换 时间戳是指格林威治时间1970年01月01日00时00分00秒开始计算所经过的秒数 是一个浮点数 time和datetime都是Python中的内置模块 不需要安装 直接可
  • golang 自定义命令行flag包简单使用

    一 为什么需要使用golang自定义命令行 不恰当的比喻 当我们写了一个服务代码后 按照简单的思维 我们会在业务代码中将要连接的数据库 用户名 主机名 端口号 密码写死 那么也就意味着我们启动该服务后都只能固定连接某一个数据库 而如果我们将
  • 使用Python操作MySQL的小技巧

    更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 好看站 http www nrso net 高州阳光论坛https www hnthzk com 1 获取插入数据的主键id import pymysql d
  • passwd Authentication token manipulation error----linux

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 author skatetime 2009 04 11
  • springboot2.x入门(六)—@validated注解结合全局异常控制器实现统一参数校验

    写接口的时候 参数校验是不是还一个一个的判空或者判断格式是否正确 业务代码没写几行 写了一堆if StringUtils isBlank 对不对 我说的对不对 小啦 逼格小啦 今天我就来深入浅出的讲讲spring boot Validate
  • uni——初次加载问题处理(赋值后再调用)

    案例描述 此案例中 一进页面接收good id并调用接口 这个流程正常 这个changeNum也是一进页面就触发了 组件购物车加减自带 且触发的顺序在onload赋值id之前 这时候good id还是为空 所以接口报错 如何处理这个问题毕竟
  • 解决0% [Waiting for headers] 导致的unable to lock the administration directory (/var/lib/dpkg/) is anothe...

    这是我在配置vim的YouCompleteMe时遇到的问题 我需要使用CMake来编译YCM 在我输入 sudo apt install cmake 由于网络原因导致安装一直卡在0 Waiting for headers 在我多次尝试后发现
  • vue3的基本使用(超详细)

    一 初识vue3 1 vue3简介 2020年9月18日 vue3发布3 0版本 代号大海贼时代来临 One Piece 特点 无需构建步骤 渐进式增强静态的 HTML 在任何页面中作为 Web Components 嵌入 单页应用 SPA
  • C++多态

    目录 多态的概念 多态的定义及实现 多态的构成条件 虚函数的重写 虚函数重写的两个例外 C 11 override和final 函数重载 覆盖 重写 隐藏 重定义 的对比 抽象类 概念 接口继承和实现继承 多态的原理 虚函数表 动态绑定和静
  • 判断当前点击屏幕位置是否UI组件

    判断当前点击位置是否是UI组件 避免在点击按钮时 还继续屏幕其他操作 using System Collections using System Collections Generic using UnityEngine using Uni
  • 04以太坊测试网(Testnets)

    什么是测试网 测试网络 简称testnet 用于模拟以太网主网的行为 有一些公开的测试网络可以替代以太坊区块链 这些网络上的货币毫无价值 但它们仍然很有用 因为合约和协议变更的功能可以在不中断以太网主网或使用真实货币的情况下进行测试 当主网
  • 软考报名照片制作

    报名官网 其实人家官网很贴心的有给照片审核工具 就在上传照片的下面 一行蓝色的小字 下载照片验证工具 emmmm 直接下载安装就好 上传你的白底证件照 然后他会自动给你修建成他需要的照片 然后记得保存 直接提交就可上传成功
  • Android Studio:Gradle project sync failed

    问题 Unable to find method java lang String org gradle api artifacts result ComponentSelectionReason getDescription 参考 gra
  • Java基础-面向对象

    Java基础 面向对象 由于年前工作太忙 实在没时间整理Java基本知识 但是可能长时间不更新不好看 再说我个人也没有半途而废的习惯 所以决定节前还是更新一篇吧 这也算是Java的基本思想和一些偏进阶的东西 如果思考透彻了 理解清楚了 那么
  • 华为od机试题-2023-最新真题-完整题库-两周350分

    华为OD机试题库每半年刷新一次 目前已经整理了90道原题 并提供了java python C 三种解法 这就是2023年Q2的完整题库了 华为OD机试2周350分 高效复习策略 1 牛客网刷基础算法题 每个算法都了解一下 用一周时间 牛客网
  • 基于JDBC的图书管理系统

    文章目录 1 图书管理系统类图 2 程序设计 2 1Student类 2 2Teacher类 2 3Sever类 2 4BookManage类 2 5Manage类 2 6Mbin类 2 7Menu类 3 功能 3 1管理员功能 3 2学生
  • 应急响应LINUX&Windows

    应急响应LINUX Windows linux 文件名 说明 etc passwd 用户信息文件 etc crontab 定时任务文件 etc anacrontab 异步定时任务文件 etc rc d rc local 开机启动项 var
  • angular2 通过 ControlValueAccessor NG_VALUE_ACCESSOR实现自定义表单控件

    一 演示自定义控件的双向绑定 二 如何实现 cform component ts 自定义表单控件CformComponent 的实现 注意下里面的注释段落 import Component OnInit Input forwardRef f
  • QT自定义Widget控件及其使用

    今天来给大家分享一下QT自定义widget控件及其使用 当ui设计器提供的界面不满足实际需求时 可以从QWidget继承自定义的界面组件 有两种方法一种是提升法 另一种是ui设计器自定义界面组件widget组件 我们本次先说提升法 通过这个