【问题标题】:How to make a qframe highlight when cursor is on it in PyQt4?当光标在 PyQt4 上时如何使 qframe 突出显示?
【发布时间】:2017-03-27 18:59:35
【问题描述】:

我有以下带框架的窗口。

我希望框架在鼠标位于其区域时突出显示(在我的情况下更改其形状)。

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

但它给出了一个错误。我找到了另一种方法 - 信号映射器 但我不知道如何使用它。

【问题讨论】:

    标签: python pyqt pyqt4 mouseevent qframe


    【解决方案1】:

    您的代码中的问题是执行 for 时的变量 w 保留在最后一个元素中,因此它只会在后者中执行。为了解决这个问题,我实现了一个继承自 QFrame 的 Frame 类,在该类中我覆盖了 enterEventleaveEvent 函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多