Qt之实现自定义控件的两种方式——插件法

news2024/11/17 16:15:21

文章目录

  • 前言
  • 一、需求
  • 二、实现
    • 1、新建项目
    • 2、自定义控件类
    • 3、编译插件
    • 4、拖拽使用
      • (1)在designer.exe中直接拖拽
      • (2)在Qt Creator的设计师中直接拖拽
    • 5、在项目中正常使用


前言

  可以通过Qt设计师拖拽原生控件进行界面开发,但有时候原生控件不能满足项目需求。此时,就需要实现自定义控件。
  Qt中实现自定义控件,有两种方式,即提升法和插件法。本篇介绍插件法。

一、需求

  同上一篇一样,自定义实现一个电池电量显示控件,可以通过设置参数的方式修改电池电量值。电量值等级不同,颜色不同。
  低电量时,效果如下:
在这里插入图片描述
  电量较高或满电时,效果如下:
在这里插入图片描述

二、实现

1、新建项目

  新建项目,选择“其他项目”,如下:
请添加图片描述
  项目名称为“myBatteryPlugin”,如下:
请添加图片描述
  一直下一步,命名自定义控件类类名为myBattery,控件基类为QWidget,插件类名为myBatteryPlugin,设置插件图标,如下:
请添加图片描述
  下一步,命名插件名称为mybatteryplugin,如下:
请添加图片描述
  点击下一步,直至项目创建完成,工程组织结构如下:
在这里插入图片描述

2、自定义控件类

  新建一个自定义控件类,类名为myBattery,继承于QWidget类,该类主要负责实现自定义控件,注意此处使用Q_DECL_EXPORT 宏。
  核心代码如下:

class Q_DECL_EXPORT myBattery : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
    Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue)
    Q_PROPERTY(double value READ getValue WRITE setValue)
    Q_PROPERTY(double alarmValue READ getAlarmValue WRITE setAlarmValue)

    Q_PROPERTY(double step READ getStep WRITE setStep)
    Q_PROPERTY(int borderWidth READ getBorderWidth WRITE setBorderWidth)
    Q_PROPERTY(int borderRadius READ getBorderRadius WRITE setBorderRadius)
    Q_PROPERTY(int bgRadius READ getBgRadius WRITE setBgRadius)
    Q_PROPERTY(int headRadius READ getHeadRadius WRITE setHeadRadius)

    Q_PROPERTY(QColor borderColorStart READ getBorderColorStart WRITE setBorderColorStart)
    Q_PROPERTY(QColor borderColorEnd READ getBorderColorEnd WRITE setBorderColorEnd)

    Q_PROPERTY(QColor alarmColorStart READ getAlarmColorStart WRITE setAlarmColorStart)
    Q_PROPERTY(QColor alarmColorEnd READ getAlarmColorEnd WRITE setAlarmColorEnd)

    Q_PROPERTY(QColor normalColorStart READ getNormalColorStart WRITE setNormalColorStart)
    Q_PROPERTY(QColor normalColorEnd READ getNormalColorEnd WRITE setNormalColorEnd)

public:
    explicit myBattery(QWidget *parent = 0);
    ~myBattery();

signals:
    void valueChanged(double value);

private slots:
    void updateValue();

private:
    double minValue;                //最小值
    double maxValue;                //最大值
    double value;                   //目标电量
    double alarmValue;              //电池电量警戒值

public:
    double getMinValue()            const;
    double getMaxValue()            const;
    double getValue()               const;
    double getAlarmValue()          const;

protected:
    void paintEvent(QPaintEvent *);
    void drawBorder(QPainter *painter);
    void drawBg(QPainter *painter);
    void drawHead(QPainter *painter);
};

3、编译插件

  编译运行,可以看到生成的dll文件和lib文件,我们要使用release版本的库文件,如下:
在这里插入图片描述

4、拖拽使用

(1)在designer.exe中直接拖拽

  将mybatteryplugin.dll文件,拷贝到C:\Qt\Qt5.6.2\5.6\msvc2015\plugins\designer目录下,如下:
在这里插入图片描述
  双击运行designer.exe,就可以看到自定义的插件,如下:
请添加图片描述

(2)在Qt Creator的设计师中直接拖拽

  按照上述位置拷贝,只能单独运行designer.exe时才能看到自定义控件,在Qt Creator中的设计师里面并没有看到该控件,此时,需要将mybatteryplugin.dll文件拷贝到C:\Qt\Qt5.6.2\Tools\QtCreator\bin\plugins\designer目录下,如下:
在这里插入图片描述
  重新打开Qt Creator,打开设计师,并没有发现该控件,如下:
在这里插入图片描述
  通过工具栏菜单,查看该插件,发现插件加载失败,如下:
在这里插入图片描述
在这里插入图片描述

  这是因为电池插件是MSVC2015编译的,与Qt Creator版本并不一致,如下:
在这里插入图片描述

在这里插入图片描述
  所以,我们想要在Qt Creator中的设计师中直接拖拽该插件,一定要确保编译插件的版本和Qt Creator的版本一致。

5、在项目中正常使用

  如果已经实现了在Qt Creator设计师中的正常拖拽,我们可以按照库文件使用的方式,使用我们自定义的插件。
  使用Qt Creator新建demo工程,将mybatteryplugin.dll、mybatteryplugin.lib库文件和mybattery.h头文件,放到工程源码文件夹,添加外部库,如下:
在这里插入图片描述
在这里插入图片描述
  pro文件内容,如下:
在这里插入图片描述
  以release方式,编译运行该demo,提示异常,将mybatteryplugin.dll文件拷贝到执行文件同目录即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】操作系统及进程概念

大家好我是沐曦希💕 文章目录一、冯诺依曼体系结构二、操作系统OS三、系统调用和库函数概念四、进程1.概念2.描述进程-PCB3.查看进程4.查看系统调用5.查看进程调用6. 通过系统调用创建进程-fork初识一、冯诺依曼体系结构 我们常见的计算机,如笔记本。我…

外贸业务员该如何拓客?

最近几个月,做外贸的朋友都来吐槽,外贸干不下去了。一个B2B店铺和Google推广要花很多钱,竞争太激烈了。投入和产出极不成比例,就问我能不能解决。我也是行业出身。我问他们有没有听说过以下五种实惠高效的营销方式。然后我就想告诉…

JWT的组成以及工作原理

什么是 JWT? JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证…

SpringBoot项目中基本常用依赖分享(个人向)

目录 (1)spring-boot-starter-web (2)mysql-connector-java (3)mybatis-spring-boot-starter (4)mapper-spring-boot-starter (5)mybatis-plus-boot-st…

数组string

数组 目录:数组一维数组一维数组的定义和初始化一维数组数据元素的访问练习1 找小猪练习2 算平均值比较两个数组是否相等一维数组冒泡法排序一维数组操作一维数组查找元素**普通查找**:二分查找:二分查找 最小下标最大下标查找元素个数一维数…

如何优化 MySQL

为什么要对 SQL 进行优化 有时候数据库会出现性能低、执行时间太长、等待时间太长、SQL 语句欠佳(连接查询)、索引失效等问题,这些问题会严重拖慢一个系统的速度,因此需要对 SQL 进行优化。 SQL 的编写过程和解析过程并非是一致…

Qt样式表语法

样式规则每个样式规则由选择器和声明组成。选择器:指定受该规则影响的部件。声明:指定这个部件上要设置的熟悉如:QPushButton{color:red} QPushButton是选择器;{color:red}是声明;color是属性;red是值。选择…

使用prometheus监控ES

下载elasticsearch_exporter wget 下载二进制包并解压、运行: wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.linux-a…

ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

本文利用6818开发板完成LCD屏上绘制任意的矩形,圆形,三角形或五角星形图案,还有绘制太极,五星红旗的方案。 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制三角形 代码思路 代码实现…

【回答问题】ChatGPT上线了!用给写出可执行的实体链接模型

如何实现一个实体链接模型/代码 在实现实体链接模型之前,您需要确定所要链接的实体类型(例如人名、地名、组织机构等)。然后,您需要准备一份包含大量实体及其相应识别码的实体百科数据集。接着,您可以使用深度学习模型…

乾元通多卡聚合通信系统在应急通信领域的解决方案

后疫情时代,日益增多的大型集会类事件给现有通信系统带来极大的压力。目前,我国已经认识到应急通信系统的重要性,因此我国各个部门已经配置了不少应急通信系统和设备,并且积累了相当的使用经验。 在不同情况下,对应急…

基础数据结构——数组

目录 一、前言 二、一维数组 1、定义和初始化 2、一维变长数组 3、一维正向遍历 4、一维反向遍历 5、一维数组区间操作、一维数组从 a[1] 开始,读入一维数组 6、一维数组例题1 7、一维数组例题2 三、二维数组 1、二维数组初始化 2、三维数组初始化 3…

HTTP_day02

掘金地址 结合 小林 coding 当键入网址后,到网页显示,其间发生了什么 DNS 服务器 专门保存了 Web 服务器域名与 IP 的对应关系 域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名” DNS 服务器是一个分…

聊聊Spring中最常用的11个扩展点

前言 我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。 除…

第三十六讲:神州无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便,需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置,保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN,广播SSID,启用VAP,若无其他DHCP服务器的话&#x…

业务状态实时监控预警,「告警配置」来帮您

腾讯云数据连接器iPaaS团队服务了各行各业的数百家客户后,发现许多企业有大量的自建应用/SaaS应用,却缺乏一套可靠灵活的告警系统。当相关的IT系统/资源调配出现故障后,往往是影响到业务系统被用户投诉后,技术人员才发现故障并展开…

【超详细】LightGBM介绍与应用

目录 1. LightGBM简介 2. LightGBM详细介绍 2.1 单边梯度抽样算法 2.2 直方图算法 2.3 互斥特征捆绑算法 2.4 基于最大深度的 Leaf-wise 的垂直生长算法(带深度限制的 Leaf-wise 算法) 2.5 类别特征最优分割 (直接支持类别特征&#xf…

【自学Python】Windows安装Python

Windows安装Python Python下载 Python下载地址 https://www.python.org/Python下载 打开上面的链接,打开 Python 的下载页面,如下图所示: 我们把鼠标放到 Downloads 上,然后点击 Windows,此时界面如下图所示&#…

Docker简介

Docker官网链接: http://docker.p2hp.com/问题:我们开发的嵌入式项目基本是基于虚拟机下的ubuntu的,如果每一个项目要求的系统版本、库版本、交叉编译工具链等不一样,我们就需要为每一个项目安装一个对应的ubuntu,这既…

【Leetcode】111. 二叉树的最小深度

一、题目 1、题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例1: 输入:root [3,9,20,null,null,15,7] 输出:2…