Python 如何在PyQt4/PySide中的eventfilter中的QListWidget顶部绘制?
我在QLable上尝试了这一点,效果很好,我不想对小部件进行子类化,因为它们是在.ui文件中定义的,我只需要做简单的修改,以避免委托。如果我把代码放在paintEvent中,它会工作,但为什么我不能把它放在eventfilter中呢 它似乎画了正方形,但它在listWidgetItem区域的下方Python 如何在PyQt4/PySide中的eventfilter中的QListWidget顶部绘制?,python,pyqt,pyside,qpainter,qlistwidget,Python,Pyqt,Pyside,Qpainter,Qlistwidget,我在QLable上尝试了这一点,效果很好,我不想对小部件进行子类化,因为它们是在.ui文件中定义的,我只需要做简单的修改,以避免委托。如果我把代码放在paintEvent中,它会工作,但为什么我不能把它放在eventfilter中呢 它似乎画了正方形,但它在listWidgetItem区域的下方 # -*- coding: utf-8 -*- from PySide.QtCore import * from PySide.QtGui import * class xxxx(QListWidge
# -*- coding: utf-8 -*-
from PySide.QtCore import *
from PySide.QtGui import *
class xxxx(QListWidget):
def __init__(self, parent=None):
super(xxxx, self).__init__(parent)
self.installEventFilter(self)
# def paintEvent(self, event):
# p = QPainter()
# p.begin(self.viewport())
# p.setPen(QPen(Qt.black))
# p.fillRect(QRect(0, 1, 20, 20), Qt.red)
# p.end()
def eventFilter(self, widget, event):
if event.type() == QEvent.Paint:
p = QPainter()
# p.begin(self.viewport())
p.begin(widget)
p.setPen(QPen(Qt.red))
p.fillRect(QRect(0, 1, 20, 20), Qt.red)
p.end()
return True
return QListWidget.eventFilter(self, widget, event)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
view = xxxx()
view.show()
sys.exit(app.exec_())
您需要在视口上安装事件过滤器:
class xxxx(QListWidget):
def __init__(self, parent=None):
super(xxxx, self).__init__(parent)
self.viewport().installEventFilter(self)
def eventFilter(self, widget, event):
if event.type() == QEvent.Paint and widget is self.viewport():
p = QPainter()
p.begin(widget)
p.setPen(QPen(Qt.red))
p.fillRect(QRect(0, 1, 20, 20), Qt.red)
p.end()
return True
return super(xxxx, self).eventFilter(widget, event)
为什么
返回super…
而不是简单地false
?虚假也不会传播upwards@qrtLs因为您必须遵守基类实现的返回值,它可以是True
或False
。(将有几十种不同的事件类型通过此筛选器,不仅仅是绘制事件)。确实是荣誉,但是true/false是可以的,但是为什么返回super(xxxx,self)。eventFilter(小部件,事件)
(==应该不荣誉==false,对吗?@qrtLs严格来说,OPs事件筛选器是不正确的,因为它不检查事件与哪个对象相关。这与他们的问题并不相关,但我现在修改了我的答案来解决它。必须始终调用基类实现,以便正确处理所有对象的所有事件。OPs示例实际上并没有在任何其他对象上安装事件过滤器,但这一原则仍然适用,因为其中一个基类可能已经安装了事件过滤器。因此,return False是oke,并意味着事件被吃掉,我确信没有注册其他用户安装的eventfilter也可以处理它。否则我需要超级。。。等