从QScrollArea获取wheelEvents

1 投票
2 回答
746 浏览
提问于 2025-04-15 12:20

我想把自定义的小部件放进一个QScrollArea里,但在我的自定义小部件中,我重写了wheelEvent(e)这个方法,但它从来没有被调用过。

我并不在乎滚动区域没有鼠标滚轮滚动的功能。我只需要这些滚轮事件能调用我的处理函数。我试着在主窗口的层面上处理这些事件,但只有在滚动小部件到达某个极限的时候才会收到事件,那时候它也不能再移动了,我需要的是所有的事件。

这是我代码的一个简化版本:

class custom(QWidget):
    def __init__(self, parent=None):
        super(custom, self).__init__(parent)
        self.parent = parent

    def wheelEvent(self,event):
        print "Custom Widget's wheelEvent Handler"

class mainw(QMainWindow):
    def __init__(self, parent=None):
        super(mainw, self).__init__(parent)
        scroll = QScrollArea()
        self.tw = thread_widget(scroll)
        scroll.setWidget(self.tw)
        self.setCentralWidget(scroll)

    def wheelEvent(self,event):
        print "Main Window's wheelEvent Handler"

有人能告诉我在这种情况下,事件处理程序是怎么决定接收事件的吗?

2 个回答

0

你可以在自己的自定义类里安装一个事件过滤器。

class custom(QWidget):
    def __init__(self, parent=None):
        super(custom, self).__init__(parent)
        self.parent = parent
        self.installEventFilter(self)

    def eventFilter(self, qobject, qevent):
        qtype = qevent.type()
        if qtype == QEvent.Wheel:
            ... wheel event logic
            return True
        # parents event handler for all other events
        return super(custom,self).eventFilter(qobject, qevent)
0

我发现这个问题和QObject的installEventFilter方法有关,但我没能让示例代码正常运行,所以我决定不再纠结,彻底改变了我的计划。

问题解决了。

撰写回答