Qt中类提升后不显示问题

问题描述:

最近在qtCreator中写了一个程序.在这个程序中有一个控件需要自定义.所以我在使用qt设计师类画了一个控件然后再添加了一个MyButton类.在这个MyButton类里面我重写了几个鼠标事件以及重写了绘制事件:

每个重写的函数内的详细代码如下:

cpp 复制代码
void MyButton::mousePressEvent(QMouseEvent *e)
{
    //鼠标点击事件
    if(e->button() == Qt::LeftButton)
    {
        //加载点击图像
        p.load(m_press);
        //重绘
        update();
    }
    //还是要调用原来的事件进行响应
    QPushButton::mousePressEvent(e);
}

void MyButton::enterEvent(QEvent *e)
{
    p.load(m_hover);
    update();
    QPushButton::enterEvent(e);
}

void MyButton::leaveEvent(QEvent *e)
{
    p.load(m_normal);
    update();
    QPushButton::leaveEvent(e);
}

void MyButton::mouseReleaseEvent(QMouseEvent *e)
{
    //鼠标点击事件
    if(e->button() == Qt::LeftButton)
    {
        //加载点击图像
        p.load(m_normal);
        //重绘
        update();
    }
    //还是要调用原来的事件进行响应
    QPushButton::mouseReleaseEvent(e);
}

void MyButton::paintEvent(QPaintEvent *e)
{
    (void)e;
    //重绘
    QPainter painter();
    painter.drawPixmap(rect(),p);
   // QPushButton::paintEvent(e);
}

在写下这些代码时我出现了组件提升后运行程序不显示的问题.查找bug时按照如下顺序进行了查找:

1,自定义控件的大小大于被提升控件的大小.

这块问题我在之前写项目时就遇到过,但是很可惜在排查完该项目后还是不对,自定义控件还是不显示.

2,重绘事件的问题

因为在自定义类中重写了重绘事件,所以对重绘事件代码进行了查看.我发现在重绘事件中没有调用QPushButton的重绘事件.所以:

1,我在代码中添加了QPushButton::paintEvent(QEvent*e);代码显示了但是显示的方式是以QPushButton原本的方式现实的.

2,去掉原本的事件,在重绘事件中给QPainter画家类指定父元素为该类.就是将 QPainter painter() 变成 QPainter painter(this);然后就正常显示了.