QT Widget: 自定义Widget组件及创建和使用动静态库

学习自定义Widget组件,书中的案例:

// 自定义QmyBattery组件
// QmyBattery.c++
#include "qmybattery.h"QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent)
{}/** 1.QPainter的viewport()与window()分别代表着物理坐标与逻辑坐标区域,默认两个区域是重合的,也就是用户指定的rect区域在两者上是同样的大小、位置。
2.setWindow()可以设置你想指定的rect区域,比如rect=(-50,-50,100,100),此时你定义的逻辑区域左上坐标(-50,-50),右下坐标(50,50),大小(100X100),
最重要的是QPainter的drawLine、drawRect或者其它draw操作都是以这个逻辑坐标区域为准来绘制图像的,也就是此时的坐标系原点(0,0)就是(-50,-50)了。
3.SetViewport()设置的是物理坐标区域,它代表着实际显示的区域,切记这只是用户规定的画图区域而不是画图的坐标直接以它为准,你画的图像还是以window()
区域的坐标系为准,最终是要将winodw()逻辑区域映射到viewport()物理区域的,这样以后在使用QPainter进行绘制图形时就可以通过设置这两个方法去放大、
平移图像了,比如保持window()逻辑坐标不变,将viewport()物理坐标区域大小变为之前的2倍,那么实际显示的图像也会自动放大2倍了,至于平移也差不多,我懒得算了。
*/
void QmyBattery::paintEvent(QPaintEvent *event) {Q_UNUSED(event)QPainter painter(this);// 画家qDebug() << "width = "<<width() <<";height = " <<height();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 > mWarnLevel) {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 power) {mPowerLevel = power;emit powerLevelChanged(power);repaint();
}int QmyBattery::powerLevel() {return mPowerLevel;
}void QmyBattery::setWarnLevel(int warn) {mWarnLevel = warn;repaint();
}int QmyBattery::warnLevel() {return mWarnLevel;
}QSize QmyBattery::siezeHint() {int H = this->height();int W = H *12/5;QSize size(W,H);return  size;
}// QmyBattery.h
#ifndef QMYBATTERY_H
#define QMYBATTERY_H#include <QWidget>
#include <QPainter>
#include <QDebug>class QmyBattery : public QWidget
{Q_OBJECT
private:QColor mColorBack = Qt::white;QColor mColorBorder = Qt::black;QColor mColorPower = Qt::green;QColor mColorWarning = Qt::red;int mPowerLevel = 60;int mWarnLevel = 20;
protected:void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
public:explicit QmyBattery(QWidget *parent = nullptr);void setPowerLevel(int power);int powerLevel();void setWarnLevel(int warn);int warnLevel();QSize siezeHint();signals:void powerLevelChanged(int);public slots:
};#endif // QMYBATTERY_H// 使用 MainWindow.c++
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->battery->setPowerLevel(10);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_slider_valueChanged(int value){qDebug() << "value = " <<value;ui->battery->setPowerLevel(value);
}

效果图:
在这里插入图片描述
二、创建动态库
1、创建工程
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)创建工程名称mySharedLib,选择工程路径。
(4 )添加类名称,我的为QmyBattery选择类型。选择模块为Widgets。动态库选择:
在这里插入图片描述
静态库选择:
在这里插入图片描述
工程新建成功之后,工程目录如下:
在这里插入图片描述
2、自动生成的.pro文件如下:

QT += widgetsTARGET = mySharedLibTEMPLATE = lib
DEFINES += MYSHAREDLIB_LIBRARYCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \qmybattery.cppHEADERS += \mySharedLib_global.h \qmybattery.h# Default rules for deployment.
unix {target.path = /usr/lib
}
!isEmpty(target.path): INSTALLS += target

3、添加代码,完成qmybattery.cpp,qmybattery.h文件。

// qmybattery.cpp
#include "qmybattery.h"QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent)
{}/** 1.QPainter的viewport()与window()分别代表着物理坐标与逻辑坐标区域,默认两个区域是重合的,也就是用户指定的rect区域在两者上是同样的大小、位置。
2.setWindow()可以设置你想指定的rect区域,比如rect=(-50,-50,100,100),此时你定义的逻辑区域左上坐标(-50,-50),右下坐标(50,50),大小(100X100),
最重要的是QPainter的drawLine、drawRect或者其它draw操作都是以这个逻辑坐标区域为准来绘制图像的,也就是此时的坐标系原点(0,0)就是(-50,-50)了。
3.SetViewport()设置的是物理坐标区域,它代表着实际显示的区域,切记这只是用户规定的画图区域而不是画图的坐标直接以它为准,你画的图像还是以window()
区域的坐标系为准,最终是要将winodw()逻辑区域映射到viewport()物理区域的,这样以后在使用QPainter进行绘制图形时就可以通过设置这两个方法去放大、
平移图像了,比如保持window()逻辑坐标不变,将viewport()物理坐标区域大小变为之前的2倍,那么实际显示的图像也会自动放大2倍了,至于平移也差不多,我懒得算了。
*/
void QmyBattery::paintEvent(QPaintEvent *event) {Q_UNUSED(event)QPainter painter(this);// 画家qDebug() << "width = "<<width() <<";height = " <<height();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 > mWarnLevel) {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 power) {mPowerLevel = power;emit powerLevelChanged(power);repaint();
}int QmyBattery::powerLevel() {return mPowerLevel;
}void QmyBattery::setWarnLevel(int warn) {mWarnLevel = warn;repaint();
}int QmyBattery::warnLevel() {return mWarnLevel;
}QSize QmyBattery::siezeHint() {int H = this->height();int W = H *12/5;QSize size(W,H);return  size;
}//  qmybattery.h
#ifndef QMYBATTERY_H
#define QMYBATTERY_H#include <QWidget>
#include <QPainter>
#include <QDebug>#include "mySharedLib_global.h"class MYSHAREDLIB_EXPORT QmyBattery: public QWidget
{Q_OBJECT
private:QColor mColorBack = Qt::white;QColor mColorBorder = Qt::black;QColor mColorPower = Qt::green;QColor mColorWarning = Qt::red;int mPowerLevel = 60;int mWarnLevel = 20;
protected:void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
public:explicit QmyBattery(QWidget *parent = nullptr);void setPowerLevel(int power);int powerLevel();void setWarnLevel(int warn);int warnLevel();QSize siezeHint();signals:void powerLevelChanged(int);public slots:
};#endif // QMYBATTERY_H

3、构建生成so文件。
在这里插入图片描述

在这里插入图片描述
三、使用动态库
1、新建一个工程useShare。
2、把so文件及.h文件拷贝到工程下。注意去掉so后面的1.0.0
在这里插入图片描述

3、添加库
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)我是将程序运行到板子里,所以选linux
在这里插入图片描述
添加完成后.pro文件:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetunix:!macx: LIBS += -L$$PWD/./ -lmySharedLibINCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.

4、添加.h文件。只选择qmybattery.h文件。
在这里插入图片描述
5、加载QmyBatter组件。

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QmyBattery *battery = new QmyBattery(this);battery->setParent(this);battery->move(100,100);battery->show();battery->setPowerLevel(50);
}MainWindow::~MainWindow()
{delete ui;}// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "qmybattery.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

编译运行代码。因为程序在板子里面运行需要把libmySharedLib.so.1.0.0文件push到板子/usr/lib路径下。
静态库的生成和使用 比较简单。不做记录。

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

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

相关文章

Topaz DeNoise AI:一键让照片重获清晰 mac/win激活版

Topaz DeNoise AI是一款革命性的图片降噪软件&#xff0c;它利用先进的人工智能算法&#xff0c;帮助用户轻松去除照片中的噪点&#xff0c;恢复图像的清晰度和细节。无论是专业摄影师还是摄影爱好者&#xff0c;Topaz DeNoise AI都能成为他们处理图片时的得力助手。 Topaz De…

57.仿简道云公式函数实战-文本函数-REPT

1. REPT函数 将文本重复一定次数。 2. 函数用法 REPT(text, number_times) 3. 函数示例 将文本重复一定次数。 text: 必需。需要重复显示的文本。 Number_times: 必需。用于指定文本重复次数的正数。 4. 代码实战 首先我们在function包下创建text包&#xff0c;在text…

Win UI3开发笔记(四)设置主题续

上文讲到过关于界面和标题栏以及普通文本的主题设置&#xff0c;这篇说一下关于对话框的主题设置。 我最终没找到办法&#xff0c;寻求办法的朋友可以不用接着看了&#xff0c;以下只是过程。 一个对话框包括标题部分、内容部分和按钮部分&#xff0c;其中&#xff0c;在Cont…

ISP代理是什么?跨境账号养号为什么要选择它?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

Android Stdio Execution failed for task ‘:app:compileDebugKotlin‘ 报错解决

具体报错信息如下&#xff1a; compileDebugJavaWithJavac task (current target is 1.8) and compileDebugKotlin task (current target is 17)jvm target compatibility should be set to the same Java version.很显然&#xff0c;这是一个版本冲突问题&#xff0c;compile…

字符函数和字符串函数(C语言进阶)(三)

目录 前言 接上篇&#xff1a; 1.7 strtok 1.8 strerror 1.9 字符分类函数 总结 前言 C语言中对字符和字符串的处理是很频繁的&#xff0c;但是c语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或着字符数组中。 字符串常量适用于那些对它不做修改的字…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环…

Java多线程算法总结

1. 标题三个线程同时运行&#xff0c;依次打印ABC&#xff0c;一共打印10次 算法代码如下&#xff1a; public class ThreadTest {private Object oa new Object();private Object ob new Object();private Object oc new Object();private static final String TAG &quo…

【精选】Java项目介绍和界面搭建——拼图小游戏 中

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

LeetCode 刷题 [C++] 第148题.排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 题目分析 根据题意&#xff0c;可以使用归并排序来对链表进行排序。归并排序是基于分治的思想&#xff0c;比较容易实现的就是自顶向下的递归方式来实现。 先找出链表的中点&#x…

游泳耳机哪个牌子质量好?4大高口碑产品推荐入手

游泳耳机作为一种专业的水上音频装备&#xff0c;能够使游泳者在游泳过程中享受音乐的同时保持安全和舒适。随着科技的发展&#xff0c;市面上涌现出许多品牌和型号的游泳耳机&#xff0c;但是其中哪个牌子的质量更好呢&#xff1f;下面这篇文章将为大家介绍四大热门口碑产品&a…

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…

单点故障解决方案之Smart Link与Monitor Link

-SmartLink技术&#xff0c;创建Smart Link 组。在该组中&#xff0c;加入两个端口。其中1个端口是主端口&#xff0c;也称之为Master端口。另外1个端口是备份端口:也称之为 Slave 端口。 -Monitor Link 组也称之为“监控链路组&#xff0c;由上行端口和下行端口共同组成。下行…

SDR架构 (二) 为什么很多SDR频谱中间有尖峰?

相信大家第一次打开gnuradio看听广播、看频谱的时候&#xff0c;会注意到一个奇怪的现象&#xff0c;明明在频谱中间不该有信号&#xff0c;但是实际看到了一个尖峰。这个尖峰不含带任何信息&#xff0c;并且不管调节到哪个中心频率&#xff0c;这个尖峰都会存在。 这种情况出…

达梦数据库把日志数据按天统计不同状态的数据,实现字段行转列与根据id分组

1、这是日志表记录的数据&#xff0c;现在需要统计出每个app_id各个警告类型alarm_type的总数 2、先实现行转列&#xff0c;把三个alarm_type值转成列字段 SQL select app_id,count(CASE WHEN alarm_typeconcurrency THEN 1 ELSE null END) AS currentCount,count(CASE WHEN …

期货开户保证金保障市场正常运转

期货保证金是什么&#xff1f;在期货市场上&#xff0c;采取保证金交易制度&#xff0c;投资者只需按期货合约的价值&#xff0c;交一定比率少量资金即可参与期货合约买卖交易&#xff0c;这种资金就是期货保证金。期货保证金&#xff08;以下简称保证金〕按性质与作用的不同。…

Docker 第十九章 : 阿里云个人镜像仓使用

Docker 第十九章 : 阿里云个人镜像仓使用 本章知识点: 如何创建镜像库,如何设置密码,如何登录与退出个人镜像仓,如何本地打镜像,如何将本地镜像推送到个人镜像库。 背景 在项目YapiDocker部署中,因读取mongo:latest 版本不一致,导致后续执行步骤的异常。遇到此场景…

在UniApp中引入大于40kb字体包的记录

因为项目UI需要特殊字体&#xff0c;所以给了一个80kb字体包&#xff0c;但是在正常的使用导入时候发现不生效 这是我的导入过程 1.把下载好的文件放入static/font目录中 2.在app.vue中引用 font-face { font-family: zitiming; src: url(/static/font/YouSheBiaoTiHei-2.t…

Matlab进阶绘图第41期—双三角网格曲面图

在《Matlab论文插图绘制模板第67期—三角网格图(Trimesh)》中&#xff0c;我分享过三角网格曲面图的绘制模板。 然而&#xff0c;有的时候&#xff0c;需要在一张图上绘制两个及以上的三角网格曲面图&#xff0c;且每个三角网格曲面图使用不同的配色方案。 在Matlab中&#x…

使用Axure RP并配置IIS服务结合内网穿透实现公网访问本地HTML原型页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…