Как сделать подсветку qframe при наведении на нее курсора в PyQt4?

У меня есть следующее окно с рамками.

Я хочу, чтобы рамка была выделена (в моем случае измените ее форму), когда мышь находится в его области.

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()) 

но это дает ошибку. Я нашел еще один способ сделать это - отображение сигнала, но я не знаю, как его использовать.

1 ответ

Решение

Проблема в вашем коде: переменная w при выполнении for остается с последним элементом, поэтому он будет выполняться только в последнем. Чтобы решить эту проблему, я реализовал класс Frame, который наследуется от 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_())

Другие вопросы по тегам