5

簡単な質問です。pyqt で次のような効果を探しています。

Jquery UIスライダーボックスをハンドラーに追従させる方法は?

しかし、それらのコードは JQuery であり、私は PyQT でそれを達成しようとしています

import sys
from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 500)
        self.setWindowTitle("PyQT example!")
        slider = QtGui.QSlider(self)
        slider.setOrientation(QtCore.Qt.Horizontal)
        slider.move(50, 50)
        slider.valueChanged.connect(self.value_changed)
        self.show()

    def value_changed(self, value):
        QtGui.QToolTip.showText(QtGui.QCursor.pos(), str(value), self)

app = QtGui.QApplication(sys.argv)
GUI = Window()
sys.exit(app.exec_())

このコードは、ヒント バルーンをカーソルに追従させることに成功しました。チップをスライダー ハンドラーに追従させることはできますか?

4

2 に答える 2

7

私は@tmoreauのアイデアが好きですが、新しいロジックをQSliderのサブクラスに入れる方が良いです:

class TipSlider(QtGui.QSlider):
    def __init__(self, *args, tip_offset=QPoint(0, -45)):
        super(QtGui.QSlider, self).__init__(*args)
        self.tip_offset = tip_offset

        self.style = QtGui.QApplication.style()
        self.opt = QtGui.QStyleOptionSlider()

        self.valueChanged.connect(self.show_tip)
        # self.enterEvent = self.show_tip
        # self.mouseReleaseEvent = self.show_tip

    def show_tip(self, _):
        self.initStyleOption(self.opt)
        rectHandle = self.style.subControlRect(self.style.CC_Slider, self.opt, self.style.SC_SliderHandle)

        pos_local = rectHandle.topLeft() + self.tip_offset
        pos_global = self.mapToGlobal(pos_local)
        QtGui.QToolTip.showText(pos_global, str(self.value()), self)
于 2015-07-27T16:58:02.347 に答える
3

あなたの質問はそれほど単純ではありません。これが私の完璧ではない解決策です:

  1. まず、 を追跡する必要があるため、すべてをQSliderに置き換える必要があります。sliderself.slider

  2. から、QSliderハンドルを含む四角形を抽出できます。

    style=self.slider.style()
    opt=QtGui.QStyleOptionSlider()
    self.slider.initStyleOption(opt)
    rectHandle=style.subControlRect(QtGui.QStyle.CC_Slider,opt, QtGui.QStyle.SC_SliderHandle,self)
    
  3. rectHandleでありQRect、ピクセル単位で位置を取得するメソッドがいくつかあります。with 、... または
    with 、...すべての位置は、親ウィジェット、ここではスライダーを基準にします。 例として、長方形の右下隅の絶対位置を取得するには、次のようにします。intQRect.bottom()QRect.right()QPointQRect.center()QRect.bottomRight

    myPoint=rectHandle.bottomRight()+self.slider.pos()
    
  4. 改善するには:ツール ヒントの適切な位置を見つける
    いくつかの魔法の数字を使用して、私の最善の試みを以下に示します。

    magicX = 5
    magicY = 15
    
    x = rectHandle.right() + rectHandle.width() + self.slider.pos().x() + magicX
    y = rectHandle.bottom() + rectHandle.height() + self.slider.pos().y() + magicY
    
  5. もちろん、カスタムの位置にツールチップを表示する必要があります:

    QtGui.QToolTip.showText(QtCore.QPoint(x,y), str(value), self)
    

注意: すべての計算はvalue_changedメソッドで行われます。

于 2015-07-27T15:23:02.957 に答える