相关文章推荐
想表白的面包  ·  java ...·  1 年前    · 
玩命的松树  ·  HTML ...·  1 年前    · 
踢足球的火腿肠  ·  C++ 模板简介 - 简书·  1 年前    · 

我重写了一个类myslider继承自QSlider,然后重写了paintEvent(QPaintEvent *)方法。
然后从工具栏拖一个QSlider工具到主界面上,名字为verticalSlider,然后将这个QSlider提升为自己的myslider
然后运行的时候发现不会执行myslider::paintEvent(QPaintEvent *)函数。也就是界面上不显示这个QSlider。

解决方案:
主界面构造函数中添加如下代码:

ui->verticalSlider->setParent(this);
ui->verticalSlider->show();

我自己重写的qslider具体如下,有兴趣的可以看看:

#include "myslider.h"
MySlider::MySlider(QWidget *parent):
    m_SliderDir(VERTICAL_SLIDER),
    m_nMarkNum(5),
    m_fTopleftScale(0),
    m_fBottomleftScale(1)
MySlider::~MySlider()
void MySlider::paintEvent(QPaintEvent *)
    //启用反锯齿
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    //绘制标尺
    QFont font = QFont("Microsoft YaHei");
    font.setPointSizeF(8);
    painter.setFont(font);
    int height = this->height();
    int width = this->width();
    qint64 nTotalTime= m_iStartDateTime.secsTo(m_iEndDateTime);//计算总时间(秒)
    qint64 nStepTime = nTotalTime*(m_fBottomleftScale-m_fTopleftScale)/(m_nMarkNum-1);//计算相邻刻度之间的时间间隔
    QDateTime iStartDateTime = m_iStartDateTime.addSecs(nTotalTime*m_fTopleftScale);//计算缩放后的开始时间
    if(m_SliderDir==VERTICAL_SLIDER)//垂直slider
        qreal fStep = (height-10)*1.0f/(m_nMarkNum-1);//计算相邻刻度之间的距离
        for(int i=0;i<m_nMarkNum;i++)//绘制每一个刻度的时间与刻度标记
            qreal fY = 10+fStep*i;
            QPointF ptText=QPointF(0,fY);
            QDateTime iCurDateTime = iStartDateTime.addSecs(nStepTime*i);
            QString strTime = iCurDateTime.toString("hh:mm");
            painter.setPen(QPen(Qt::red,1));
            painter.drawText(ptText,strTime);
            painter.setPen(QPen(Qt::blue,2));
            //绘制大刻度
            painter.drawLine(QPointF(width,fY-5),QPointF(width-4,fY-5));
            //绘制小刻度
            painter.setPen(QPen(Qt::blue,1));
            for(int j = 1;j<4;j++)
                painter.drawLine(QPointF(width,fY-3+j*(fStep/4)),QPointF(width-4,fY-3+j*(fStep/4)));
        painter.setPen(QPen(Qt::blue,2));
        painter.drawLine(QPointF(width,0),QPointF(width,height));
    else if(m_SliderDir == HORIZONTAL_SLIDER)//水平slider
        //TODO:如果要让标尺横向显示,则需要在此处完善代码
void MySlider::setStartStamp(qint64 nStartStamp)
    QDateTime iOriginTime = QDateTime::fromString("1970-01-01 08:00:00","yyyy-MM-dd hh:mm:ss");
    m_iStartDateTime = iOriginTime.addSecs(nStartStamp);
void MySlider::setEndStamp(qint64 nEndStamp)
    QDateTime iOriginTime = QDateTime::fromString("1970-01-01 08:00:00","yyyy-MM-dd hh:mm:ss");
    m_iEndDateTime = iOriginTime.addSecs(nEndStamp);
void MySlider::setScale(qreal topleftScale, qreal bottomleftScale)
    m_fTopleftScale = topleftScale;
    m_fBottomleftScale = bottomleftScale;
    this->update();
    GreenHandBruce
        软件工程师