1

问题是:我有 QListWidget,该选择模式允许通过单击一个、拖动和释放另一个来选择多个项目。我想在屏幕上的任何地方释放鼠标时发出信号(仅当它首先被按下列表中的某个项目时)。我该怎么做?

从我到目前为止的调查来看:QListWidget 有信号 itemSelectionChanged,但是在拖动项目时选择每个新项目后都会发出信号

QListWidget 具有从 QAbstractItemView 继承的单击信号,但这仅适用于在同一项目上按下并释放鼠标

我试图扩展 QListWidget 类并在其中定义 mouseReleaseEvent,但这会覆盖原始事件并破坏列表的正确行为

我尝试使用 installEventFilter 制作空白标签,并创建类 mouseReleasedFilter,并且以某种方式起作用,但是有更优雅的方法吗?

class mouseReleasedFilter(QtCore.QObject):
    def __init__(self, parent = None):
        super(mouseReleasedFilter, self).__init__(parent)
    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonRelease:
        print 'released'
        return False
    return True

self.filter = mouseReleasedFilter(self)

self.label.installEventFilter(self.filter)

我将不胜感激

4

1 回答 1

2

我试图扩展 QListWidget 类并在其中定义 mouseReleaseEvent,但这会覆盖原始事件并破坏列表的正确行为

这是正确的做法;只需运行您正在使用的方法super

class MyList(QtGui.QListWidget):
    def mouseReleaseEvent(self, e):
        super(MyList, self).mouseReleaseEvent(e)
        print('released', e)

例子:

from PyQt4 import QtGui
app = QtGui.QApplication([])
class MyList(QtGui.QListWidget):
    def mouseReleaseEvent(self, e):
        super(MyList, self).mouseReleaseEvent(e)
        print('released', e)

l = MyList()
l.addItems(['hello', 'world'])
l.show()

输出:

('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
('released', <PyQt4.QtGui.QMouseEvent object at 0x72b4d40>)
于 2013-03-28T16:55:12.810 回答