Qt时间滑动选择器

功能画面展示

         特点一:可通过滑动方块内的数字,对时间进行配置功能,该程序没有直接对实时时间进行配置,但是对于时间参数,可以在getDateTime这个函数进行获取的

        特点二:如果这个时间配置器里有参数改变量了,会通过void valueChangeSign(void);这个信号传递出来

        特点三:在选择不同的年、月后,每月的最大天数也会跟随变化

完整工程代码链接

https://gitee.com/zy853728579/time-slide.git

代码展示

只贴出部分代码,如需要完整的工程,可看上面的链接

 timewidget.cpp

#include "timewidget.h"
//w=405  h=160

const int m_monthday[] = {31,28,31,30,31,30,31,31,30,31,30,31};

TimeWidget::TimeWidget(QWidget *parent) : QWidget(parent)
{
    this->setMinimumSize(405, 160);

    m_dateTime = QDateTime::currentDateTime();

    m_yearRolling = new RollingBox(this);
    m_yearRolling->setDirection(RollingBox::SD_VERTICAL);
    m_yearRolling->setRange(m_minYear, m_maxYear);
    m_yearRolling->setValue(m_dateTime.date().year());
    QObject::connect(m_yearRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);

    m_ymLabel = new QLabel("-", this);
    m_ymLabel->show();

    m_monthRolling = new RollingBox(this);
    m_monthRolling->setDirection(RollingBox::SD_VERTICAL);
    m_monthRolling->setRange(1, 12);
    m_monthRolling->setValue(m_dateTime.date().month());
    QObject::connect(m_monthRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);

    m_mdLabel = new QLabel("-", this);
    m_mdLabel->show();

    m_dayRolling = new RollingBox(this);
    m_dayRolling->setDirection(RollingBox::SD_VERTICAL);
    setMaxDay(m_dateTime.date().year(), m_dateTime.date().month());
    m_dayRolling->setValue(m_dateTime.date().day());
    QObject::connect(m_dayRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);

    m_hourRolling = new RollingBox(this);
    m_hourRolling->setDirection(RollingBox::SD_VERTICAL);
    m_hourRolling->setRange(0, 23);
    m_hourRolling->setValue(m_dateTime.time().hour());
    QObject::connect(m_hourRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);

    m_hmLabel = new QLabel(":", this);
    m_hmLabel->show();

    m_minRolling = new RollingBox(this);
    m_minRolling->setDirection(RollingBox::SD_VERTICAL);
    m_minRolling->setRange(0, 59);
    m_minRolling->setValue(m_dateTime.time().minute());
    QObject::connect(m_minRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);

    m_msLabel = new QLabel(":", this);
    m_msLabel->show();

    m_secRolling = new RollingBox(this);
    m_secRolling->setDirection(RollingBox::SD_VERTICAL);
    m_secRolling->setRange(0, 59);
    m_secRolling->setValue(m_dateTime.time().second());
    QObject::connect(m_secRolling, &RollingBox::valueChangedSign, this, &TimeWidget::valueChangeSlot);
}

void TimeWidget::setDateTime(const QDateTime &dateTime)
{
    if (dateTime.date().year() < m_minYear || dateTime.date().year() > m_maxYear)
        return ;
    m_yearRolling->setValue(dateTime.date().year());
    m_monthRolling->setValue(dateTime.date().month());
    m_dayRolling->setValue(dateTime.date().day());
    m_hourRolling->setValue(dateTime.time().hour());
    m_minRolling->setValue(dateTime.time().minute());
    m_secRolling->setValue(dateTime.time().second());
}

void TimeWidget::resizeEvent(QResizeEvent *event)
{
    int xPos = 0;
    int height = event->size().height();
    int yearWidth = event->size().width() / 6;
    if (yearWidth < 70)
        yearWidth = 70;

    m_yearRolling->resize(yearWidth, height);
    m_yearRolling->move(xPos, 0);

    xPos += m_yearRolling->size().width();
    m_ymLabel->move(xPos + 5, (height / 2) - 10);

    xPos += 15;
    m_monthRolling->resize(yearWidth * 3 / 4, height);
    m_monthRolling->move(xPos, 0);

    xPos += m_monthRolling->size().width();
    m_mdLabel->move(xPos + 5, (height / 2) - 10);

    xPos += 15;
    m_dayRolling->resize(yearWidth * 3 / 4, height);
    m_dayRolling->move(xPos, 0);

    xPos += 15;
    xPos += m_dayRolling->size().width();
    m_hourRolling->resize(yearWidth * 3 / 4, height);
    m_hourRolling->move(xPos, 0);

    xPos += m_hourRolling->size().width();
    m_hmLabel->move(xPos + 5, (height / 2) - 10);

    xPos += 15;
    m_minRolling->resize(yearWidth * 3 / 4, height);
    m_minRolling->move(xPos, 0);

    xPos += m_minRolling->size().width();
    m_msLabel->move(xPos + 5, (height / 2) - 10);

    xPos += 15;
    m_secRolling->resize(yearWidth * 3 / 4, height);
    m_secRolling->move(xPos, 0);

    qDebug()<<"w="<<xPos + m_secRolling->size().width()<<"h="<<height;
}

void TimeWidget::valueChangeSlot(int value)
{
    RollingBox * box = static_cast<RollingBox *>(this->sender());
    if (box == m_yearRolling)
    {
        if (value == m_dateTime.date().year())
            return ;
        int month = m_dateTime.date().month();
        setMaxDay(value, month);
        int day   = m_dateTime.date().day();
        m_dateTime.setDate(QDate(value, month, day));
        qDebug()<<"year value="<<value;
        emit valueChangeSign();
    }
    else if (box == m_monthRolling)
    {
        if (value == m_dateTime.date().month())
            return ;
        int year = m_dateTime.date().year();
        setMaxDay(year, value);
        int day   = m_dateTime.date().day();
        m_dateTime.setDate(QDate(year, value, day));
        qDebug()<<"month value="<<value;
        emit valueChangeSign();
    }
    else if (box == m_dayRolling)
    {
        if (value == m_dateTime.date().day())
            return ;
        int year = m_dateTime.date().year();
        int month   = m_dateTime.date().month();
        m_dateTime.setDate(QDate(year, month, value));
        qDebug()<<"day value="<<value;
        emit valueChangeSign();
    }
    else if (box == m_hourRolling)
    {
        if (value == m_dateTime.time().hour())
            return ;
        int min = m_dateTime.time().minute();
        int sec = m_dateTime.time().second();
        m_dateTime.setTime(QTime(value, min, sec));
        qDebug()<<"hour value="<<value;
        emit valueChangeSign();
    }
    else if (box == m_minRolling)
    {
        if (value == m_dateTime.time().minute())
            return ;
        int hour = m_dateTime.time().hour();
        int sec = m_dateTime.time().second();
        m_dateTime.setTime(QTime(hour, value, sec));
        qDebug()<<"min value="<<value;
        emit valueChangeSign();
    }
    else if (box == m_secRolling)
    {
        if (value == m_dateTime.time().second())
            return ;
        int hour = m_dateTime.time().hour();
        int min = m_dateTime.time().minute();
        m_dateTime.setTime(QTime(hour, min, value));
        qDebug()<<"sec value="<<value;
        emit valueChangeSign();
    }
}

int TimeWidget::monthToDay(int year, int month)
{
    if (month == 2) {
        return (((year%4 == 0) && ((year%100 != 0) || (year%400 == 0)))? 29: 28);
    }else{
        return(m_monthday[month-1]);
    }
}

void TimeWidget::setMaxDay(int year, int month)
{
    int maxDay = monthToDay(year, month);
    m_dayRolling->setRange(1, maxDay);
    if (m_dateTime.date().day() > maxDay)
        m_dateTime.setDate(QDate(year, month, maxDay));
}

 timewidget.h

#ifndef TIMEWIDGET_H
#define TIMEWIDGET_H

#include <QWidget>
#include <QDebug>
#include <QDateTime>
#include <QLabel>

#include "rollingbox.h"

class TimeWidget : public QWidget
{
    Q_OBJECT
public:
    explicit TimeWidget(QWidget *parent = nullptr);

    void setDateTime(const QDateTime & dateTime);
    QDateTime getDateTime(void) const { return m_dateTime; }

signals:
    void valueChangeSign(void);

protected:
    void resizeEvent(QResizeEvent *event) override;

private slots:
    void valueChangeSlot(int value);

private:
    static int monthToDay(int year, int month);
    void setMaxDay(int year, int month);

private:
    RollingBox * m_yearRolling;
    RollingBox * m_monthRolling;
    RollingBox * m_dayRolling;
    RollingBox * m_hourRolling;
    RollingBox * m_minRolling;
    RollingBox * m_secRolling;

    QLabel * m_ymLabel;
    QLabel * m_mdLabel;
    QLabel * m_hmLabel;
    QLabel * m_msLabel;

    QDateTime m_dateTime;
    int m_minYear = 1990, m_maxYear = 2090;
};

#endif // TIMEWIDGET_H

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用QSS样式表来修改Qt滑动条的颜色,具体方法如下: 1. 在Qt Designer中选中滑动控件,打开属性编辑器。 2. 在属性编辑器中找到styleSheet属性,点击右侧的编辑按钮。 3. 在弹出的QSS编辑器中,输入以下代码: QSlider::groove:horizontal { border: 1px solid #bbb; background: white; height: 10px; border-radius: 5px; } QSlider::handle:horizontal { background: qlineargradient(x1:, y1:, x2:1, y2:1, stop: #eee, stop:1 #ccc); border: 1px solid #777; width: 20px; margin: -5px ; border-radius: 10px; } 4. 修改代码中的颜色值,可以通过修改stop:和stop:1后面的颜色值来改变滑动条的颜色。 5. 点击确定保存修改,即可看到滑动条的颜色已经改变。 注意:以上代码仅适用于水平方向的滑动条,如果需要修改垂直方向的滑动条,需要将代码中的horizontal改为vertical。 ### 回答2: 在Qt中,可以通过自定义样式来修改滑动条的两边颜色。 首先,在Qt Designer或者代码中创建或找到滑动条的对象。 然后,通过设置滑动条的StyleSheet属性来自定义样式。在StyleSheet中,使用QSlider::groove伪状态选择器和QSlider::handle伪状态选择器来分别修改滑动条的两边颜色和滑块的颜色。 以修改滑动条两边颜色为例,可以按照以下步骤进行: 1. 选择滑动条对象,并在属性面板中找到StyleSheet属性。 2. 点击属性值旁边的编辑按钮,进入编辑模式。 3. 在StyleSheet编辑框中输入以下代码: QSlider::groove:horizontal { background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #ff0000, stop:1 #00ff00); } 其中,QSlider::groove:horizontal选择器表示选择水平滑动条的轨道部分。 background属性设置滑动条两边的颜色。在上述代码中,使用了线性渐变的方式将滑动条的两边颜色设置为红色(#ff0000)和绿色(#00ff00)。 4. 根据需要,可以根据集合的值设置其他样式属性,如高度、边框、圆角等。 5. 完成后,点击确定按钮保存样式。 运行程序,滑块的两边颜色将会根据设置的样式显示。 通过以上步骤,我们可以轻松地修改Qt滑动条的两边颜色。 ### 回答3: Qt滑动条可以使用样式表来修改2边的颜色。滑动条有多个子元素,包括滑块、刻度和轨道等,通过设置不同的属性值,可以改变滑动条的样式和颜色。 首先,可以使用`QSlider::handle`来设置滑块的样式。通过设置`background-color`属性,可以改变滑块的背景颜色。 其次,可以使用`QSlider::add-page`来设置左边和右边的轨道颜色。可以通过设置`background-color`属性,来改变轨道的颜色。如果要修改左边的颜色,可以使用`groove:horizontal:up`选择器;如果要修改右边的颜色,可以使用`groove:horizontal:down`选择器。 例如,下面的样式表代码将滑块的背景颜色设置为红色,左边轨道的颜色为绿色,右边轨道的颜色为蓝色: ```cpp QSlider::handle { background-color: red; } QSlider::groove:horizontal:up { background-color: green; } QSlider::groove:horizontal:down { background-color: blue; } ``` 将上述的样式表代码应用到滑动条对象上,即可实现修改滑动条两边颜色的效果。 需要注意的是,以上代码中的选择器`QSlider::handle`、`QSlider::groove:horizontal:up`和`QSlider::groove:horizontal:down`是针对水平方向的滑动条,如果是垂直方向的滑动条,选择器需要相应修改。另外,还可以通过设置其他属性,如边框颜色、阴影效果等,来进一步定制滑动条的外观。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kk电子粉丝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值