簡體   English   中英

如何在 PyQt4/PySide 的 eventfilter 中的 QListWidget 頂部繪制?

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

我在 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM