为QPushButton启用抗锯齿功能

时间:2014-11-06 16:01:28

标签: c++ qt event-handling antialiasing

我有一个QPushButton,我通过样式表为边框图像设计样式。但是,图像质量很差,因为图像不是使用抗锯齿绘制的。

有没有办法在没有子类化QPushButton并给它一个新画家的情况下启用抗锯齿?我并不是真的想这样做,因为我广泛使用样式表,并且必须创建一堆QProperties来模拟现有的伪状态功能。

1 个答案:

答案 0 :(得分:1)

您通常可以使用Anti-aliasing flag方法在QPainter对象上设置setRenderHints。这通常通过子类化小部件并覆盖paintEvent来完成。

根据Qt Docs for QPainter

  

...当paintdevice是一个小部件时,QPainter只能在paintEvent()函数内或paintEvent()调用的函数中使用...

如果没有子类化,您将仅限于使用Event Filter拦截paintEvent并自行设置标志。

您需要创建一个覆盖对象的事件处理程序的类。该课程将使用QObject::installEventFilter安装。此类需要过滤事件以处理您关心的特定事件(QPaintEvent)。然后,它需要创建一个QPainter对象,该对象接收原始对象(使用第二个constructor)作为其设备,如此qtforum post所示。这是有效的,因为QWidget继承自QPaintDevice。

... 
myView::handlePaintEvent(QObject *obj, QEvent *eve)  
{  
    QPainter painter(static_cast<QWidget *>(obj));
} 
...

从这里开始,您应该可以将正确的渲染提示设置为您需要的颜色。

这个相同的事件过滤器类可以安装在众多对象上,因此可以非常快速地添加相同的功能,而无需继承其他任何小部件。