十一、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件

1、自定义Widget组件

使用步骤
  • 采用提升法(promotion)
  • 重新定义paintEvent事件

2、实现程序

在这里插入图片描述

(1)创建项目,基于QWidget

在这里插入图片描述

(2)添加类,为Widget组件提升类

#include "battery.h"
#include <QPainter>int Battery::powerLevel() const
{return mPowerLevel;
}void Battery::setPowerLevel(int powerLevel)
{mPowerLevel = powerLevel;repaint();
}void Battery::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 <= mWarning){brush.setColor(mColorWarning);pen.setColor(mColorWarning);}else{brush.setColor(mColorPower);pen.setColor(mColorPower);}painter.setBrush(brush);painter.setPen(pen);if(mPowerLevel > 0){rect.setRect(5, 5, mPowerLevel, 40);painter.drawRect(rect);}// 绘制百分比文字QFontMetrics textSize(this->font());QString powerStr = QString::asprintf("%d%%", mPowerLevel);QRect textRect = textSize.boundingRect(powerStr);pen.setColor(mColorBorder);painter.setPen(pen);painter.drawText(55 - textRect.width() / 2, 23 + textRect.height() / 2, powerStr);}Battery::Battery(QWidget *parent) : QWidget(parent)
{}

(3)设置标题和图标(图标需要选择资源中图标,直接选择文件可能无效)

在这里插入图片描述

(4)实现电池电量修改

#include "widget.h"
#include "ui_widget.h"#include "battery.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->battery->setPowerLevel( ui->horizontalSlider->value() );
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{int nPower = ui->horizontalSlider->value();ui->battery->setPowerLevel(nPower);ui->label->setText(QString::asprintf("当前电量: %d%%", nPower));
}

在这里插入图片描述

二、自定义QtDesigner插件

1、实现程序

(1)创建自定义控件工程

在这里插入图片描述
在这里插入图片描述
设置分组
在这里插入图片描述

(2)将生成的dll库拷贝到Tools\QtCreator\bin\plugins\designer下

(3)创建项目,基于QWidget

在UI编辑界面组件栏可以看到多分组MyWidget下有了Battery组件。(我没做出来,始终是加载失败,之后测试处理)
初步分析:似乎因为Qt IDE是由MSVC编译,所以插件必须为MSVC编译(本人使用MSVC2015 64bit测试,没有加载成功,之后测试32bit)

在这里插入图片描述
在这里插入图片描述

三、静态链接库

1、静态链接库的创建和使用

(1)创建静态链接库

  • MSVC编译器生成的库后缀为“.lib”
  • MinGW编译器生成的库后缀为".a"

(2)使用静态库

需要使用静态库文件和h文件,不需要cpp文件

2、实现程序

在这里插入图片描述

(1)创建Library项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)使用图表中的一个窗口

在这里插入图片描述

(3)创建项目调用库

(4)添加库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(5)实现功能

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 逻辑坐标painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

在这里插入图片描述

四、共享库(动态链接库)

1、动态库声明

(1)隐式加载

#if defined(DLL_LIBRARY)
#define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif

(2)显示加载(直接打开dll库,直接解析调用函数)

typedef int (*FunDef)(int);FunDef myFun = (FunDef)myLib.resolve("funName"); //解析dll函数
int n = myFun(1); //调用函数

2、实现隐式加载程序

(1)创建动态库工程

在这里插入图片描述

(2)导出动态库

class SHAREDLIBSHARED_EXPORT DialogPen : public QDialog

(3)实现功能

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 逻辑坐标painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

在这里插入图片描述

3、实现显式加载程序

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

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

相关文章

探索C语言位段的秘密

位段 1. 什么是位段2. 位段的内存分配3. 位段的跨平台问题4. 位段的应用4. 使用位段的注意事项 1. 什么是位段 我们使用结构体实现位段&#xff0c;位段的声明和结构体是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是int&#xff0c;unsigned int&#xff0c;或…

python学习笔记 - 标准库函数

概述 为了方便程序员快速编写Python脚本程序&#xff0c;Python提供了很多好用的功能模块&#xff0c;它们内置于Python系统&#xff0c;也称为内置函数(Built-in Functions&#xff0c;BlF)&#xff0c;Python 内置函数是 Python 解释器提供的一组函数&#xff0c;无需额外导…

前端常见面试题之vue3

文章目录 1. vue3比vue2有哪些优势2. 描述vue3的生命周期3. 如何看待vue3中的Composition API 和 Options API4. 如何理解ref、 toRef、和toRefs?5. vue3升级了哪些功能6. Composition API如何实现代码逻辑的复用&#xff08;hook)7. Vue3如何实现响应式的8.Vue3使用Proxy对象…

计算机网络实验八 利用 Java /C++开发网络聊天应用程序

一、实验目的和要求 1)基本掌握利用 Java 开发环境调试应用程序的方法。 2)理解基于套接字开发网络应用程序的过程,深入理解客户/服务器方式工作原理。 3)掌握基于Java和C++开发网络通信程序的方法。 二、实验环境 1)运行 Windows 2008 Server/XP/7 操作系统的 PC 2 台…

vue基础操作(vue基础)

想到多少写多少把&#xff0c;其他的想起来了在写。也写了一些css的 input框的双向数据绑定 html <input value"123456" type"text" v-model"account" input"accou" class"bottom-line bottom" placeholder"请输入…

golang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

虚拟列表【vue】等高虚拟列表/非等高虚拟列表

文章目录 1、等高虚拟列表2、非等高虚拟列表 1、等高虚拟列表 参考文章1 参考文章2 <!-- eslint-disable vue/multi-word-component-names --> <template><divclass"waterfall-wrapper"ref"waterfallWrapperRef"scroll"handleScro…

数据湖delta lake

Table of Content1. 课程2. 前置技能3. 一、数据湖概念[了解] 3.1. 1.1 企业的数据困扰 3.1.1. 困扰一&#xff1a;互联网的兴起和数据孤岛3.1.2. 困扰二&#xff1a;非结构化数据3.1.3. 困扰三&#xff1a;保留原始数据3.1.4. 补充&#xff1a;什么是结构化&#xff1f; 3.1.4…

09 Redis之分布式系统(数据分区算法 + 系统搭建与集群操作)

6 分布式系统 Redis 分布式系统&#xff0c;官方称为 Redis Cluster&#xff0c;Redis 集群&#xff0c;其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据&#xff0c;并将用户请求方便地路由到不同 Redis 的问题。 什么是分布式系统?…

音乐格式转换软件有哪些?5款必备神器

音乐格式转换软件有哪些&#xff1f;音乐&#xff0c;作为人类情感的载体&#xff0c;伴随着我们生活的每一个角落。在享受音乐的同时&#xff0c;我们有时也面临着音乐格式不兼容的问题。不用担心&#xff0c;今天我将为大家揭秘五款音乐格式转换软件&#xff0c;让你的音乐之…

华为配置Mesh普通业务示例

配置Mesh普通业务示例 组网图形 图1 配置Mesh组网示意图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 在企业内部各区域通过建立Mesh无线回传链路&#xff0c;实现无线覆盖区域拓展&#xff0c;降低有线部署成本。 组网需求 AC组网方式&#xff1a…

sqllabs的order by注入

当我们在打开sqli-labs的46关发现其实是个表格&#xff0c;当测试sort等于123时&#xff0c;会根据列数的不同来进行排序 我们需要利用这个点来判断是否存在注入漏洞&#xff0c;通过加入asc 和desc判断页面有注入点 1、基于使用if语句盲注 如果我们配合if函数&#xff0c;表达…

面试经典150题——存在重复元素 II

​"The harder you work for something, the greater youll feel when you achieve it." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 该思路很简单&#xff0c;就是暴力的查找每一个元素&#xff0c;查看是否满足题目要求&#xff0c;满足就…

Darkhole 2

kali:192.168.223.128 靶机:192.168.223.152 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.152 开启了22 80 端口 web 进入登录界面发现没有注册按钮了 扫一下目录 gobuster dir -u http://192.168.223.152 -x html,txt,php,bak,zip,git --wor…

单片机精进之路-5矩阵键盘扫描

如下图&#xff0c;先在p3口输出0xfe&#xff0c;再读取p3口的电平&#xff0c;如果没有按键按下&#xff0c;temp & 0xf0还是0xf0&#xff0c;如果又第一个键按下&#xff0c;temp & 0xf0还是0xee&#xff0c;其他按键由此类推可得。 //4*4键盘检测程序,按下键后相应…

Linux的文件操作,重拳出击( ̄︶ ̄)

Linux的文件操作 学习Linux的文件操作&#xff0c;一般需要知道一个文件如果你想要操作他&#xff0c;必须知道你对这个文件有什么操作的权限或者修改你自己对文件操作的权限。必须要知道文件有三种权限 r&#xff1a;可读 w&#xff1a;可写 x&#xff1a;可执行 在打开Linux…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案&#xff0c;有哪些操作 cookie 的方式session 方案是如何实现的&#xff0c;存在哪些问题token 是如何实现的&#xff0c;如何进行编码和防篡改&#xff1f;jwt 是做什么的&#xff1f;refresh token 的实现和意义ses…

《C++面向对象程序设计》✍学习笔记

C的学习重点 C 这块&#xff0c;重点需要学习的就是一些关键字、面向对象以及 STL 容器的知识&#xff0c;特别是 STL&#xff0c;还得研究下他们的一些源码&#xff0c;下面是一些比较重要的知识&#xff1a; 指针与引用的区别&#xff0c;C 与 C 的区别&#xff0c;struct 与…

网络技术ensp 一个简单的交换机配置案例

由于工作调岗&#xff0c;转战网络运维了&#xff0c;第一次网络笔记 1.&#xff0c;目的&#xff1a;2台主机相互可以ping通&#xff0c;并且可以ping通网关地址&#xff0c;设备&#xff1a;2台主机&#xff0c;2台交换机 2网络拓扑图如下 3.主机pc1的配置信息 ip&#xff…