Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在PyQt4/PySide中的eventfilter中的QListWidget顶部绘制?_Python_Pyqt_Pyside_Qpainter_Qlistwidget - Fatal编程技术网

Python 如何在PyQt4/PySide中的eventfilter中的QListWidget顶部绘制?

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

我在QLable上尝试了这一点,效果很好,我不想对小部件进行子类化,因为它们是在.ui文件中定义的,我只需要做简单的修改,以避免委托。如果我把代码放在paintEvent中,它会工作,但为什么我不能把它放在eventfilter中呢

它似乎画了正方形,但它在listWidgetItem区域的下方

# -*- 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也可以处理它。否则我需要超级。。。等