简体   繁体   English

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

[英]How to paint on top of QListWidget in eventfilter in PyQt4/PySide?

I tried this on QLable and it works, I do not want to subclass the widget, because they are defined in .ui files, and I just need to do simple modification so I want to avoid delegate.我在 QLable 上尝试了这个并且它有效,我不想对小部件进行子类化,因为它们是在 .ui 文件中定义的,我只需要做简单的修改,所以我想避免委托。 If I put my code in paintEvent it works, but why I can not put it in eventfilter?如果我把我的代码放在paintEvent中它可以工作,但为什么我不能把它放在eventfilter中?

It seems it painted the square but it's below the listWidgetItem area.它似乎绘制了正方形,但它位于 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_())

You need to install the event-filter on the viewport:您需要在视口上安装事件过滤器:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM