记录一个问题:
我重写了一个类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();
```
```
}
```
```