QSlider与QLabel叠加层上的鼠标交互问题

时间:2014-10-16 01:52:48

标签: python qt overlay pyside

我对Qt / PySide很陌生,并尝试找出一种方法将QLabel覆盖到QSlider而不会丢失鼠标事件的交互性。目前正在使用QStackedLayout我无法使用顶部的标签正确触发它们,并且它在下面时甚至不起作用(滑块不插值,从最小值跳到最大值)。

from PySide import QtCore, QtGui


class CustomSlider(QtGui.QWidget):
    def __init__(self, minVal=0.0, maxVal=1.0, default=0.0):
        super(CustomSlider, self).__init__()

        self.slider = QtGui.QSlider()
        self.slider.setRange(0.0, 1.0)
        self.slider.setOrientation(QtCore.Qt.Horizontal)
        self.slider.setStyleSheet("""
            QSlider::groove:horizontal {
                background: black;
                height: 40px;
            }

            QSlider::sub-page:horizontal {
                background: grey;
                height: 40px;
            }

            QSlider::add-page:horizontal {
                background: black;
                height: 40px;
            }""")

        self.overlay = QtGui.QLabel()
        self.overlay.setText("LABEL")
        self.overlay.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.overlay.setStyleSheet("""QLabel{font: bold 18px;}""")

        self.layout = QtGui.QStackedLayout()
        self.layout.setStackingMode(QtGui.QStackedLayout.StackAll)
        self.layout.addWidget(self.slider)
        self.layout.addWidget(self.overlay)

        self.setLayout(self.layout)

任何建议都非常受欢迎。

此致

1 个答案:

答案 0 :(得分:0)

滑块从0跳到1,因为它只接受整数值。例如,如果您将最大值设置为100,那么您将发现它可以正常工作。

对于堆叠,您始终可以通过以下方式传递事件:

class CustomSlider(QtGui.QWidget):
    def __init__(self, minVal=0.0, maxVal=1.0, default=0.0):
        super(CustomSlider, self).__init__()

        self.slider = QtGui.QSlider()
        self.slider.setRange(0.0, 100.0)  # <--
        self.slider.setOrientation(QtCore.Qt.Horizontal)
        self.slider.setStyleSheet("""
            QSlider::groove:horizontal {
                background: black;
                height: 40px;
            }

            QSlider::sub-page:horizontal {
                background: grey;
                height: 40px;
            }

            QSlider::add-page:horizontal {
                background: black;
                height: 40px;
            }""")
        self.overlay = QtGui.QLabel()
        self.overlay.setText("LABEL")
        self.overlay.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.overlay.setStyleSheet("""QLabel{font: bold 18px;color:red;}""")
        self.overlay.mousePressEvent = self.slider.mousePressEvent     # <--
        self.overlay.mouseReleaseEvent = self.slider.mouseReleaseEvent # <--
        self.layout = QtGui.QStackedLayout()
        self.layout.setStackingMode(QtGui.QStackedLayout.StackAll)
        self.layout.addWidget(self.slider)
        self.layout.addWidget(self.overlay)

        self.setLayout(self.layout)