我重写了一个类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)
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)
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
软件工程师