Python 在PyQt4中,当光标位于qframe上时,如何使其高亮显示?
我有以下带有框架的窗口 我希望当鼠标位于其区域时,框架被高亮显示(在我的例子中,更改其形状)Python 在PyQt4中,当光标位于qframe上时,如何使其高亮显示?,python,pyqt,pyqt4,mouseevent,qframe,Python,Pyqt,Pyqt4,Mouseevent,Qframe,我有以下带有框架的窗口 我希望当鼠标位于其区域时,框架被高亮显示(在我的例子中,更改其形状) from PyQt4 import QtGui, QtCore import sys app = QtGui.QApplication(sys.argv) window = QtGui.QWidget() window_layout = QtGui.QVBoxLayout() window.setLayout(window_layout) #fill content for i in range(
from PyQt4 import QtGui, QtCore
import sys
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window_layout = QtGui.QVBoxLayout()
window.setLayout(window_layout)
#fill content
for i in range(10):
label = QtGui.QLabel(str(i))
frame = QtGui.QFrame()
frame_layout = QtGui.QVBoxLayout()
frame.setLayout(frame_layout)
frame_layout.addWidget(label)
window_layout.addWidget(frame)
def layout_widgets(layout):
return (layout.itemAt(i) for i in range(layout.count()))
def mouse_enter(event):
print 'frame enter'
w.widget().setFrameShape(3)
def mouse_leave(event):
print 'frame leave'
w.widget().setFrameShape(0)
for w in layout_widgets(window_layout):
print w.widget()
w.widget().enterEvent = mouse_enter
w.widget().leaveEvent = mouse_leave
window.show()
sys.exit(app.exec_())
它可以工作,但仅在布局高亮显示中的最后一帧。
如何仅使该框架更改鼠标所在位置的形状
我尝试了以下方法:
def mouse_enter(event, frame):
print 'frame enter'
frame.setFrameShape(3)
w.widget().enterEvent = functools.partial(mouse_enter, w.widget())
但它给出了一个错误。我找到了另一种方法——信号映射器
但是我不知道如何使用它。代码中的问题是,在执行for时,变量w保留在最后一个元素中,因此它将只在后者中执行。为了解决这个问题,我实现了一个框架类,该类继承自
QFrame
,其中我覆盖enterEvent
和leaveEvent
函数
from PyQt4 import QtGui, QtCore
import sys
class Frame(QtGui.QFrame):
def __init__(self, text, parent=None):
super(Frame, self).__init__(parent=parent)
label = QtGui.QLabel(text)
frame_layout = QtGui.QVBoxLayout()
frame_layout.addWidget(label)
self.setLayout(frame_layout)
def enterEvent(self, event):
self.setFrameShape(3)
def leaveEvent(self, event):
self.setFrameShape(0)
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window_layout = QtGui.QVBoxLayout()
window.setLayout(window_layout)
for i in range(10):
frame = Frame(str(i))
window_layout.addWidget(frame)
window.show()
sys.exit(app.exec_())
代码中的问题执行for时的变量w保留在最后一个元素中,因此它将仅在后一个元素中执行。为了解决这个问题,我实现了一个框架类,该类继承自
QFrame
,其中我覆盖enterEvent
和leaveEvent
函数
from PyQt4 import QtGui, QtCore
import sys
class Frame(QtGui.QFrame):
def __init__(self, text, parent=None):
super(Frame, self).__init__(parent=parent)
label = QtGui.QLabel(text)
frame_layout = QtGui.QVBoxLayout()
frame_layout.addWidget(label)
self.setLayout(frame_layout)
def enterEvent(self, event):
self.setFrameShape(3)
def leaveEvent(self, event):
self.setFrameShape(0)
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window_layout = QtGui.QVBoxLayout()
window.setLayout(window_layout)
for i in range(10):
frame = Frame(str(i))
window_layout.addWidget(frame)
window.show()
sys.exit(app.exec_())