【发布时间】:2014-11-06 16:01:28
【问题描述】:
我有一个QPushButton,我正在通过样式表使用边框图像进行样式设置。但是,图像质量很差,因为没有使用抗锯齿绘制图像。
有没有什么方法可以简单地启用抗锯齿,而不需要继承 QPushButton 并给它一个新的画家?我真的不想这样做,因为我广泛使用样式表,并且必须创建一堆 QProperties 来模拟现有的伪状态功能。
【问题讨论】:
标签: c++ qt event-handling antialiasing
我有一个QPushButton,我正在通过样式表使用边框图像进行样式设置。但是,图像质量很差,因为没有使用抗锯齿绘制图像。
有没有什么方法可以简单地启用抗锯齿,而不需要继承 QPushButton 并给它一个新的画家?我真的不想这样做,因为我广泛使用样式表,并且必须创建一堆 QProperties 来模拟现有的伪状态功能。
【问题讨论】:
标签: c++ qt event-handling antialiasing
您通常可以使用setRenderHints 方法在QPainter 对象上设置Anti-aliasing flag。这通常通过子类化小部件并覆盖paintEvent来完成。
根据QtDocs 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));
}
...
从这里您应该能够将正确的渲染提示设置为您需要的。
这个相同的事件过滤器类可以安装在许多对象上,因此可以非常快速地添加相同的功能,而无需子类化任何其他小部件。
【讨论】: