2017-03-27 1 views
1

J'ai la fenêtre suivante avec des cadres.Comment faire une mise en évidence de qframe lorsque le curseur est sur PyQt4?

Je souhaite que le cadre soit en surbrillance (dans mon cas, changez de forme) lorsque la souris se trouve dans sa zone.

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

Cela fonctionne mais seule la dernière image de mise en page est mise en surbrillance. Comment faire que seul ce cadre change sa forme là où se trouve la souris?

J'ai essayé ce qui suit:

def mouse_enter(event, frame): 
    print 'frame enter' 
    frame.setFrameShape(3) 

w.widget().enterEvent = functools.partial(mouse_enter, w.widget()) 

mais il donne une erreur. J'ai trouvé une autre façon de le faire - signal mapper mais je n'ai aucune idée de comment l'utiliser.

Répondre

0

Le problème dans votre code la variable w lors de l'exécution de la est laissé avec le dernier élément, de sorte qu'il ne sera exécuté dans ce dernier. Pour résoudre ce problème, j'ai implémenté une classe Frame qui hérite de QFrame où j'écrase les fonctions enterEvent et 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_()) 

enter image description here

+0

qui est parfait, merci beaucoup – eodj