qt自定义控件不执行paintEvent(QPaintEvent *)

926 阅读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();
```

```
}
```

```