当前位置:网站首页>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 .
边栏推荐
- spark调优(三):持久化减少二次查询
- logback. XML configure logs of different levels and set color output
- 两类更新丢失及解决办法
- Pisa-Proxy SQL 解析之 Lex & Yacc
- AutoLISP series (3): function function 3
- 字节跳动高工面试,轻松入门flutter
- Ray and OBB intersection detection
- Laravel service provider instance tutorial - create a service provider test instance
- Pycharm terminal enables virtual environment
- OpenGL personal notes
猜你喜欢
【DesignMode】代理模式(proxy pattern)
[C language] question set of X
字节跳动Android面试,知识点总结+面试题解析
Personal notes of graphics (2)
网关Gateway的介绍与使用
Talk about the realization of authority control and transaction record function of SAP system
Prediction - Grey Prediction
掌握这个提升路径,面试资料分享
Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
二叉搜索树(特性篇)
随机推荐
[C language] question set of X
Cesium(3):ThirdParty/zip. js
Localstorage and sessionstorage
Introduction to ThinkPHP URL routing
Opencv personal notes
Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
Binary search tree (basic operation)
【图像传感器】相关双采样CDS
Personal notes of graphics (2)
LeetCode 300. 最长递增子序列 每日一题
23. 合并K个升序链表-c语言
A tour of gRPC:03 - proto序列化/反序列化
Sort out several important Android knowledge and advanced Android development interview questions
【DesignMode】模板方法模式(Template method pattern)
最新Android面试合集,android视频提取音频
HAVE FUN | “飞船计划”活动最新进展
Three. JS series (2): API structure diagram-2
Tidb cannot start after modifying the configuration file
Module VI
node:504报错