当前位置:网站首页>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 .
边栏推荐
- logback. XML configure logs of different levels and set color output
- Ray and OBB intersection detection
- 第九届 蓝桥杯 决赛 交换次数
- 掌握这套精编Android高级面试题解析,oppoAndroid面试题
- spark调优(三):持久化减少二次查询
- Horizontal and vertical centering method and compatibility
- Inner monologue of accidental promotion
- 模拟Servlet的本质
- ByteDance Android gold, silver and four analysis, Android interview question app
- 【DesignMode】代理模式(proxy pattern)
猜你喜欢

AutoLISP series (2): function function 2

Arduino 控制的双足机器人

Pycharm IDE下载

《产品经理必读:五种经典的创新思维模型》的读后感

Spark Tuning (III): persistence reduces secondary queries

掌握这套精编Android高级面试题解析,oppoAndroid面试题

Pycharm terminal enables virtual environment

Cesium(3):ThirdParty/zip. js

【Android -- 数据存储】使用 SQLite 存储数据
作为Android开发程序员,android高级面试
随机推荐
最新阿里P7技术体系,妈妈再也不用担心我找工作了
[vulnhub range] thales:1
【Vulnhub靶场】THALES:1
ByteDance Android gold, silver and four analysis, Android interview question app
Introduction and use of gateway
[designmode] flyweight pattern
Arduino 控制的双足机器人
字节跳动Android金三银四解析,android面试题app
掌握这个提升路径,面试资料分享
Detailed explanation of several ideas for implementing timed tasks in PHP
Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
Geoserver2.18 series (5): connect to SQLSERVER database
AutoLISP series (3): function function 3
Find tags in prefab in unity editing mode
spark调优(三):持久化减少二次查询
[C language] question set of X
AutoLISP series (2): function function 2
【DesignMode】模板方法模式(Template method pattern)
爬虫(17) - 面试(2) | 爬虫面试题库
three. JS create cool snow effect