当前位置:网站首页>Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls
Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls
2022-07-07 16:58:00 【God port】
One 、 Project creation
Read many articles about the creation of custom controls on the Internet , I feel that I have shortcomings , Let me take this to sum up .
I used VS2017+QT5.10.1
First let's create one CustomDashBoard Project , choice Qt Designer Custom Widget Program !
The project directory automatically generated by the program is as follows :
Two 、 Create a custom control
There are generally two ways , You can create strips ui You can also leave it alone ui Of , This example uses without ui Of .
CustomDashBoard.h
#ifndef CUSTOMDASHBOARD_H
#define CUSTOMDASHBOARD_H
#define LONG1 10
#define OK1 7
#define SHORT1 5
#define SPACE1 3
#define ANGLE1 10
#include <QWidget>
#include <QtGui>
#include <QtUiPlugin/QDesignerExportWidget>
class QDESIGNER_WIDGET_EXPORT CustomDashBoard : public QWidget
{
Q_OBJECT
public:
CustomDashBoard(QWidget *parent = 0);
public slots:
void setValue(qreal value);
void setAnimating(bool enable)
{
m_bAnimating=enable;
update();
}
public:
bool isAnimating() const
{
return m_bAnimating;
}
protected:
void paintEvent(QPaintEvent *);
QSize sizeHint() const
{
return QSize(300,300);
}
QSize minimumSizeHint() const
{
return QSize(200,200);
}
private:
void drawOuterCircle(QPainter* painter);
void drawInnerCircle(QPainter* painter);
void drawMark(QPainter* painter);
void drawCoverCircle(QPainter* painter);
void drawColorPie(QPainter* painter);
void drawIndicator(QPainter* painter);
void drawCoverBall(QPainter* painter);
void resetVariables(QPainter* painter);
void drawTextRect(QPainter* painter);
private:
qreal m_outerRadius;
qreal m_innerRadius;
qreal m_coverCircleRadius;
qreal m_colorCircleRadius;
qreal m_coverBallRadius;
QPointF m_center;
QRectF m_colorCircleRect;
qreal m_value;
QTimer* updateTimer;
bool m_bReverse;
qreal m_currentValue;
QTimer* singleTimer;
bool m_bAnimating;
private:
void initVariables();
private slots:
void UpdateGraph();
};
#endif
CustomDashBoard.cpp
#include "customdashboard.h"
CustomDashBoard::CustomDashBoard(QWidget *parent) :
QWidget(parent)
{
this->initVariables();
}
void CustomDashBoard::initVariables()
{
m_outerRadius=width()>height() ? height()/2: width()/2;
m_innerRadius=m_outerRadius/8*7;
m_coverCircleRadius=m_outerRadius/8*4+10;
m_colorCircleRadius=m_outerRadius/8*5;
m_center=rect().center();
m_value=0;
m_currentValue=0;
updateTimer=new QTimer(this);
updateTimer->setInterval(10);
connect(updateTimer,SIGNAL(timeout()),this,SLOT(UpdateGraph()));
singleTimer=new QTimer(this);
singleTimer->setInterval(100);
connect(singleTimer,SIGNAL(timeout()),this,SLOT(update()));
singleTimer->start();
}
void CustomDashBoard::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
resetVariables(&painter);
drawOuterCircle(&painter);
drawInnerCircle(&painter);
drawColorPie(&painter);
drawCoverCircle(&painter);
drawMark(&painter);
drawIndicator(&painter);
drawCoverBall(&painter);
drawTextRect(&painter);
painter.end();
}
void CustomDashBoard::drawOuterCircle(QPainter *painter)
{
painter->save();
QRadialGradient outerGradient(m_center,m_outerRadius,m_center);
outerGradient.setColorAt(0.0,QColor(200,200,200));
outerGradient.setColorAt(0.9,QColor(80,80,80));
outerGradient.setColorAt(0.95,QColor(180,180,180));
outerGradient.setColorAt(1.0,QColor(80,80,80));
painter->setPen(Qt::NoPen);
painter->setBrush(outerGradient);
painter->drawEllipse(m_center,m_outerRadius,m_outerRadius);
painter->restore();
}
void CustomDashBoard::drawInnerCircle(QPainter *painter)
{
painter->save();
QRadialGradient innerGradient(m_center,m_innerRadius,m_center);
innerGradient.setColorAt(0.0,QColor(130,130,130));
innerGradient.setColorAt(0.7,QColor(130,130,130));
innerGradient.setColorAt(1.0,QColor(80,80,80));
painter->setPen(Qt::NoPen);
painter->setBrush(innerGradient);
painter->drawEllipse(m_center,m_innerRadius,m_innerRadius);
painter->restore();
}
void CustomDashBoard::drawMark(QPainter *painter)
{
painter->save();
painter->setPen(Qt::white);
painter->translate(m_center);
qreal dAngle=(qreal)270/100;
qreal startAngle=45;
int value=0;
QString strValue;
for(int i=0;i<=100;i++)
{
painter->save();
painter->rotate(startAngle);
if(i%10==0)
{
strValue=tr("%1").arg(value);
qreal textWidth=fontMetrics().width(strValue);
qreal textHeight=fontMetrics().height();
QPointF bottomPot(0,m_colorCircleRadius+SPACE1);
QPointF topPot(0,m_colorCircleRadius+SPACE1+LONG1);
painter->drawLine(bottomPot,topPot);
value+=10;
painter->save();
QPointF textPot(0-textWidth/2,m_colorCircleRadius+SPACE1+LONG1+SPACE1+textHeight);
painter->translate(textPot);
painter->rotate(180);
painter->drawText(QPointF(-textWidth,textHeight/2),strValue);
painter->restore();
}
else if(i%5==0)
{
QPointF bottomPot(0,m_colorCircleRadius+SPACE1);
QPointF topPot(0,m_colorCircleRadius+SPACE1+OK1);
painter->drawLine(bottomPot,topPot);
}
else
{
QPointF bottomPot(0,m_colorCircleRadius+SPACE1);
QPointF topPot(0,m_colorCircleRadius+SPACE1+SHORT1);
painter->drawLine(bottomPot,topPot);
}
painter->restore();
startAngle+=dAngle;
}
painter->restore();
}
void CustomDashBoard::drawCoverBall(QPainter *painter)
{
painter->save();
qreal ballRadius=m_outerRadius/7;
m_coverBallRadius=ballRadius;
QRadialGradient ballGradient(m_center,ballRadius,m_center);
ballGradient.setColorAt(0.0,QColor(140,140,140));
ballGradient.setColorAt(0.7,QColor(140,140,140));
ballGradient.setColorAt(1.0,QColor(60,60,60));
painter->setBrush(ballGradient);
painter->setPen(Qt::NoPen);
painter->drawEllipse(m_center,ballRadius,ballRadius);
painter->restore();
}
void CustomDashBoard::drawTextRect(QPainter *painter)
{
painter->save();
qreal rectWidth=m_coverCircleRadius/5;
QPointF topLeftPot(m_center.x()-1.5*rectWidth,m_center.y()+rectWidth*2);
QPointF bottomRightPot(topLeftPot.x()+3*rectWidth,topLeftPot.y()+rectWidth*2);
QRectF textRect(topLeftPot,bottomRightPot);
painter->setPen(Qt::NoPen);
painter->setBrush(QColor(0,170,255));
painter->setOpacity(0.6);
painter->drawRoundRect(textRect,ANGLE1,ANGLE1);
qreal fontSize=textRect.height()/2;
QFont font;
font.setPointSize(fontSize);
painter->setFont(font);
painter->setOpacity(1.0);
painter->setPen(Qt::black);
QString strValue;
strValue=tr("%1").arg(m_value);
painter->drawText(textRect,Qt::AlignHCenter|Qt::AlignVCenter,strValue);
painter->restore();
}
void CustomDashBoard::drawCoverCircle(QPainter *painter)
{
painter->save();
painter->setBrush(QColor(130,130,130));
painter->setPen(Qt::NoPen);
painter->drawEllipse(m_center,m_coverCircleRadius,m_coverCircleRadius);
painter->restore();
}
void CustomDashBoard::drawColorPie(QPainter *painter)
{
painter->save();
QPointF topLeftPot(m_center.x()-m_colorCircleRadius,m_center.y()-m_colorCircleRadius);
QPointF bottomRightPot(m_center.x()+m_colorCircleRadius,m_center.y()+m_colorCircleRadius);
m_colorCircleRect=QRectF(topLeftPot,bottomRightPot);
painter->setPen(Qt::NoPen);
QConicalGradient greenGradient(m_center,m_innerRadius);
greenGradient.setColorAt(0.0,QColor(0,30,0));
greenGradient.setColorAt(0.25,QColor(0,230,0));
greenGradient.setColorAt(1.0,QColor(0,230,0));
painter->setBrush(Qt::green);
painter->drawPie(m_colorCircleRect,45*16,180*16);
painter->setBrush(QColor(218,218,0));
painter->drawPie(m_colorCircleRect,0*16,45*16);
painter->setBrush(QColor(240,50,50));
painter->drawPie(m_colorCircleRect,0,-45*16);
painter->restore();
}
void CustomDashBoard::drawIndicator(QPainter *painter)
{
painter->save();
painter->translate(m_center);
qreal increment=(qreal)270/100;
qreal changedAngle=45+increment*m_currentValue;
painter->rotate(changedAngle);
QPointF topPot(0,m_colorCircleRadius+LONG1);
QPointF bottomLeftPot(-m_coverBallRadius/3,0);
QPointF bottomRightPot(m_coverBallRadius/3,0);
painter->setPen(Qt::NoPen);
QLinearGradient indicatorGradient(topPot,bottomLeftPot);
indicatorGradient.setColorAt(0.0,QColor(236,187,62));
indicatorGradient.setColorAt(0.5,QColor(220,147,0));
indicatorGradient.setColorAt(1.0,QColor(236,187,62));
painter->setBrush(indicatorGradient);
QVector<QPointF> potVec;
potVec.push_back(topPot);
potVec.push_back(bottomLeftPot);
potVec.push_back(bottomRightPot);
painter->drawPolygon(potVec);
painter->restore();
}
void CustomDashBoard::resetVariables(QPainter *painter)
{
m_outerRadius=width()>height() ? height()/2: width()/2;
m_innerRadius=m_outerRadius/8*7;
m_coverCircleRadius=m_outerRadius/8*4+10;
m_colorCircleRadius=m_outerRadius/8*5;
m_center=rect().center();
}
void CustomDashBoard::setValue(qreal value)
{
if(value>m_value)
{
m_bReverse=false;
m_value=value;
if(!m_bAnimating)
{
m_currentValue=m_value;
}
}
else if(value<m_value)
{
m_bReverse=true;
m_value=value;
if(!m_bAnimating)
{
m_currentValue=m_value;
}
}
else
{
return ;
}
updateTimer->start();
}
void CustomDashBoard::UpdateGraph()
{
if(!m_bReverse)
{
m_currentValue+=0.5;
if(m_currentValue>=m_value)
{
updateTimer->stop();
}
}
else
{
m_currentValue-=0.5;
if(m_currentValue<=m_value)
{
updateTimer->stop();
}
}
update();
}
Tried to use vs Proceed to this step , There's no problem generating , But there will be small problems in later quotation , Online solutions are more complex , Need to recompile meta lib file , So I suggest you use Qt Creater establish . The main problem is QDESIGNER_WIDGET_EXPORT stay vs Will be banned .
3、 ... and 、 compile dll
choice release edition , because qt The design toolbar only recognizes release edition , After choosing , Just click the hammer
Four 、 effect
This is the generated file directory , We mainly use dll、lib And header files , Because this is a class library type , We have to call to see , Unless you add it yourself ui Project presentation . thus , Custom control creation completed .
边栏推荐
- 【图像传感器】相关双采样CDS
- Usage of config in laravel
- os、sys、random标准库主要功能
- 整理几个重要的Android知识,高级Android开发面试题
- 最新2022年Android大厂面试经验,安卓View+Handler+Binder
- 谈谈 SAP 系统的权限管控和事务记录功能的实现
- Lie cow count (spring daily question 53)
- Opportunity interview experience summary
- [designmode] template method pattern
- 掌握这套精编Android高级面试题解析,oppoAndroid面试题
猜你喜欢
null == undefined
Sort out several important Android knowledge and advanced Android development interview questions
整理几个重要的Android知识,高级Android开发面试题
C语言进阶——函数指针
3000 words speak through HTTP cache
ByteDance Android gold, silver and four analysis, Android interview question app
QT 图片背景色像素处理法
time标准库
Personal notes of graphics (3)
最新Android面试合集,android视频提取音频
随机推荐
logback.xml配置不同级别日志,设置彩色输出
AutoLISP series (1): function function 1
【C 语言】 题集 of Ⅹ
URL和URI的关系
LeetCode 300. 最长递增子序列 每日一题
蓝桥杯 决赛 异或变换 100分
二叉搜索树(特性篇)
LeetCode 1043. 分隔数组以得到最大和 每日一题
网关Gateway的介绍与使用
面试题 01.02. 判定是否互为字符重排-辅助数组算法
Introduction to ThinkPHP URL routing
第九届 蓝桥杯 决赛 交换次数
1亿单身男女“在线相亲”,撑起130亿IPO
A tour of gRPC:03 - proto序列化/反序列化
ORACLE进阶(六)ORACLE expdp/impdp详解
As an Android Developer programmer, Android advanced interview
LeetCode 1049. 最后一块石头的重量 II 每日一题
Spark Tuning (III): persistence reduces secondary queries
Vs2019 configuration matrix library eigen
[PHP] PHP interface inheritance and interface multi inheritance principle and implementation method