gpt4 book ai didi

pyqt - QWidget 可以代表 QLineEdit 检测鼠标事件吗?

转载 作者:行者123 更新时间:2023-12-04 05:23:26 24 4
gpt4 key购买 nike

我有一个 QWidget,它并排包含 QLabels 和 QLineEdits。

当我点击 QLabel 时,我可以使用 QWidget 中的 mousePressEvent。但是当我点击 QLineEdit 时,我无法在 QWidget 中检测到 mousePressEvent - 仅在 QLineEdit 中。我认为这与 QLineEdit 的工作方式有关——我不知道如何在整个区域内获取鼠标事件。

编辑:

enter image description here

我已经像上面那样为 Maya 制作了一个自定义 channel 框。我尝试通过拖动鼠标来选择多个 channel 。但正如我提到的,在 QLineEdit 区域我不能这样做。

class channelWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(channelWidget, self).__init__(parent)
self.resize(180, 20)
self.setMinimumSize(180, 20)
self.setMaximumHeight(20)
self.attr_label = QtGui.QLabel(self)
self.attr_label.setGeometry(QtCore.QRect(5, 0, 110, 20))
self.attr_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.value_field = focusLineEdit(self)
self.value_field.setGeometry(QtCore.QRect(120, 0, 60, 20))
self.value_field.setAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignLeading|QtCore.Qt.AlignVCenter)
self.value_field.setValidator(QtGui.QDoubleValidator())

每个元素由一个 QLabel 和一个 QLineEdit 组成。

class channelContainerWidget(QtGui.QWidget):
def updateChannel(self, node="", attrList=[]):
_l = self.channel_layout
_list = []
for w in [_l.itemAt(i).widget() for i in range(_l.count()) if _l.itemAt(i).widget()]:
if w in self._selectList: _list.append( str( w.attr_label.text() ) )
sip.delete(w)

_selList = []
for _id, at in enumerate(attrList):
_item = channelWidget(self)
_item.attr_label.setText(at)
_item.value_field.setText(value)
_l.insertWidget(_id, _item)

并且包含小部件的工作方式与上述相同。当我点击QLabel区域时,我可以获得鼠标事件,但是当我点击QLineEdit区域时,我不能。

最佳答案

如果您从包含布局的主小部件观看 mousePressEvent(),您看到 QLabel 点击的原因是因为默认情况下 QLabel 忽略 mousePressEvent 并允许它冒泡到下一个父级。事件从 child->parent 向上传播。

但是,QLineEdit 确实需要接受并使用鼠标按下,以处理行编辑小部件常见的焦点和其他各种操作。

所以对您来说真正好的选择是使用 event filter .这将允许您的主小部件监视其他小部件的事件,而无需子类化 QLineEdit 并实现 mousePressEvent

在此示例中,它只是监视布局的任何成员和鼠标按下,并打印,然后执行默认操作以不更改任何内容:

class Widget(QtGui.QWidget):

def __init__(self):
super(Widget, self).__init__()

self.layout = QtGui.QHBoxLayout(self)

self.label = QtGui.QLabel("Label")
self.line = QtGui.QLineEdit()

self.layout.addWidget(self.label)
self.layout.addWidget(self.line)

# have this widget (self) watch events for these
self.label.installEventFilter(self)
self.line.installEventFilter(self)

def mousePressEvent(self, event):
print "Main Widget Mouse Press"
super(Widget, self).mousePressEvent(event)

def eventFilter(self, obj, event):
# you could be doing different groups of actions
# for different types of widgets and either filtering
# the event or not.
# Here we just check if its one of the layout widgets
if self.layout.indexOf(obj) != -1:
if event.type() == event.MouseButtonPress:
print "Widget click", obj
# if I returned True right here, the event
# would be filtered and not reach the obj,
# meaning that I decided to handle it myself

# regardless, just do the default
return super(Widget, self).eventFilter(obj, event)

当您测试此代码时,您会看到单击标签会导致主小部件及其事件过滤器中的打印。但是单击行编辑只会导致事件过滤器打印语句,因为默认的 mousePressEvent 接受它并且不会进一步传播它。

关于pyqt - QWidget 可以代表 QLineEdit 检测鼠标事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com