基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件
Qt編寫(xiě)自定義控件:時(shí)間選擇控件
完整代碼
#include "rotateedittimewidget.h"
#include <QPainter>
#include <QDateTime>
#include <QDebug>
#include <QMouseEvent>
struct RotateEditTimeWidgetPrivate
{
bool isEditHour{true};
QRect handleRect;
bool isPress{false};
int angle{0};
int hour{0};
int minute{0};
QRect textRect;
};
RotateEditTimeWidget::RotateEditTimeWidget(QWidget *parent)
: QWidget(parent)
{
d_ptr = new RotateEditTimeWidgetPrivate;
auto time = QDateTime::currentDateTime().time();
d_ptr->hour = time.hour();
d_ptr->minute = time.minute();
d_ptr->angle = d_ptr->hour * 15;
}
RotateEditTimeWidget::~RotateEditTimeWidget()
{
delete d_ptr;
}
void RotateEditTimeWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setRenderHints(QPainter::TextAntialiasing);
auto thisRect = rect();
auto side = qMin(thisRect.width(), thisRect.height()) / 2 - 5;
painter.save();
painter.translate(thisRect.center());
painter.setBrush(Qt::transparent);
painter.setPen(QPen(Qt::red,3));
painter.drawEllipse(QPoint(0,0),side ,side);
painter.restore();
{
painter.save();
QString time24 = QString("%1:%2").arg(d_ptr->hour, 2, 10, QLatin1Char('0')).arg(d_ptr->minute, 2, 10, QLatin1Char('0'));
QFont font("Arial", 12);
int fontSize = side / 5;
font.setPointSize(fontSize);
font.setBold(true);
painter.setFont(font);
d_ptr->textRect = painter.boundingRect(thisRect,Qt::AlignCenter,time24);
QLinearGradient linearGradient(d_ptr->textRect.topLeft(),d_ptr->textRect.topRight());
if(d_ptr->isEditHour)
{
linearGradient.setColorAt(0.0,Qt::blue);
linearGradient.setColorAt(0.45,Qt::blue);
linearGradient.setColorAt(0.46,Qt::black);
linearGradient.setColorAt(0.6,Qt::black);
linearGradient.setColorAt(1.0,Qt::black);
}
else
{
linearGradient.setColorAt(0.0,Qt::black);
linearGradient.setColorAt(0.4,Qt::black);
linearGradient.setColorAt(0.54,Qt::black);
linearGradient.setColorAt(0.55,Qt::blue);
linearGradient.setColorAt(1.0,Qt::blue);
}
painter.setPen(QPen(QBrush(linearGradient),3));
painter.drawText(thisRect,Qt::AlignCenter,time24);
painter.restore();
}
painter.save();
painter.setBrush(QColor("#aae8e8e8"));
painter.setPen(QPen(Qt::blue,3));
painter.translate(thisRect.center());
auto handleRectTemp_zeroRect_center = QPoint(0,-side * 0.8);
QTransform transform;
transform.rotate(d_ptr->angle);
QPoint transform_p = transform.map(handleRectTemp_zeroRect_center);
d_ptr->handleRect = QRect(transform_p - QPoint(side / 9,side /9),transform_p + QPoint(side / 9,side /9));
painter.drawEllipse(d_ptr->handleRect);
painter.restore();
}
void RotateEditTimeWidget::mousePressEvent(QMouseEvent *event)
{
auto pos = event->pos();
const auto & rect = d_ptr->textRect;
if(rect.contains(pos))
{
if(QRect(rect.topLeft(),QSize(rect.width() * 0.4,rect.height())).contains(pos))
{
d_ptr->isEditHour = true;
d_ptr->angle = d_ptr->hour * 15;
}
else if(QRect(rect.topLeft() + QPoint(rect.width() * 0.6,0),QSize(rect.width() * 0.4,rect.height())).contains(pos))
{
d_ptr->isEditHour = false;
d_ptr->angle = d_ptr->minute * 6;
}
update();
}
else
{
auto temp = d_ptr->handleRect;
auto thisRect = this->rect();
temp.translate(thisRect.width() / 2,thisRect.height() / 2);
if(temp.contains(pos))
{
d_ptr->isPress = true;
update();
}
}
}
void RotateEditTimeWidget::mouseReleaseEvent(QMouseEvent *event)
{
if(d_ptr->isPress)
{
d_ptr->isPress = false;
update();
}
}
void RotateEditTimeWidget::mouseMoveEvent(QMouseEvent *event)
{
if(d_ptr->isPress)
{
auto pos = event->pos();
auto rectCenterPos = rect().center();
QLineF line1(rectCenterPos,QPoint(rectCenterPos.x(),0));
QLineF line2(rectCenterPos,pos);
d_ptr->angle = line2.angleTo(line1);
if(d_ptr->isEditHour)
{
d_ptr->hour = d_ptr->angle / 15;
}
else
{
d_ptr->minute = d_ptr->angle / 6;
}
update();
}
}效果圖

到此這篇關(guān)于基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件的文章就介紹到這了,更多相關(guān)Qt時(shí)間選擇控件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2019配置qt開(kāi)發(fā)環(huán)境的搭建過(guò)程
這篇文章主要介紹了Visual Studio 2019配置qt開(kāi)發(fā)環(huán)境的搭建過(guò)程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解
這篇文章主要介紹了c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
C語(yǔ)言實(shí)現(xiàn)猜數(shù)字大小的游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字大小的游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
C語(yǔ)言數(shù)組元素循環(huán)右移問(wèn)題及解決方法
這篇文章主要介紹了C語(yǔ)言數(shù)組元素循環(huán)右移問(wèn)題,本文通過(guò)多種方法給大家分享解決方案,通過(guò)實(shí)例代碼講解,對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

