Python Pyside2 QSlider через импорт класса
Есть два файла где test.py(основной) и (win.py) дизайн приложения. В основном файле test.py у меня вот такой код, каким образом я могу выполнить метод test из импортированного класса Slider по нажатию на слайдер
class Example(QtWidgets.QWidget):
def __init__(self):
super().__init__()
ui.setupUi(self)
self.show()
def test(self):
print("Клик")
def keyPressEvent(self, e):
if e.key() == QtGui.Qt.Key_Escape:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = Ui_Form()
ex = Example()
sys.exit(app.exec_())
А в win.py
class Slider(QSlider):
def mousePressEvent(self, event):
super(Slider, self).mousePressEvent(event)
if event.button() == Qt.LeftButton:
val = self.pixelPosToRangeValue(event.pos())
self.setValue(val)
def pixelPosToRangeValue(self, pos):
opt = QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self)
sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self)
if self.orientation() == Qt.Horizontal:
sliderLength = sr.width()
sliderMin = gr.x()
sliderMax = gr.right() - sliderLength + 1
else:
sliderLength = sr.height()
sliderMin = gr.y()
sliderMax = gr.bottom() - sliderLength + 1;
pr = pos - sr.center() + sr.topLeft()
p = pr.x() if self.orientation() == Qt.Horizontal else pr.y()
return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - sliderMin,
sliderMax - sliderMin, opt.upsideDown)
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(286, 189)
self.horizontalSlider = Slider(Form)
self.horizontalSlider.setObjectName(u"horizontalSlider")
self.horizontalSlider.setGeometry(QRect(60, 90, 160, 22))
self.horizontalSlider.setOrientation(Qt.Horizontal)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
# retranslateUi
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я отметил строки, в которые внес изменения. Поменяйте импорты под PySide2 !!!
test.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets # PyQt5
from PyQt5.Qt import * # PyQt5
# Установите импорты для PySide2 !!!
from win import Slider # +++
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(286, 189)
self.horizontalSlider = Slider(Form)
self.horizontalSlider.setObjectName(u"horizontalSlider")
self.horizontalSlider.setGeometry(QRect(60, 90, 160, 22))
self.horizontalSlider.setOrientation(Qt.Horizontal)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
class Example(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super().__init__()
# ui.setupUi(self) # ---
self.setupUi(self) # +++
self.horizontalSlider.sliderPressed.connect(self.test) # +++
def test(self, val): # + val
print(f"Клик -> {val}") # + val
def keyPressEvent(self, e):
# if e.key() == QtGui.Qt.Key_Escape: # ? QtGui
if e.key() == QtCore.Qt.Key_Escape: # QtCore
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = Ui_Form()
ex = Example()
ex.show()
sys.exit(app.exec_())
win.py
from PyQt5.Qt import *
# Установите импорты для PySide2 !!!
class Slider(QSlider):
sliderPressed = pyqtSignal(int) # PyQt5
# sliderPressed = Signal(int) # PySide2 !!!
def mousePressEvent(self, event):
super(Slider, self).mousePressEvent(event)
if event.button() == Qt.LeftButton:
val = self.pixelPosToRangeValue(event.pos())
self.setValue(val)
self.sliderPressed.emit(val) # +++
def pixelPosToRangeValue(self, pos):
opt = QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self)
sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self)
if self.orientation() == Qt.Horizontal:
sliderLength = sr.width()
sliderMin = gr.x()
sliderMax = gr.right() - sliderLength + 1
else:
sliderLength = sr.height()
sliderMin = gr.y()
sliderMax = gr.bottom() - sliderLength + 1;
pr = pos - sr.center() + sr.topLeft()
p = pr.x() if self.orientation() == Qt.Horizontal else pr.y()
return QStyle.sliderValueFromPosition(
self.minimum(),
self.maximum(),
p - sliderMin,
sliderMax - sliderMin,
opt.upsideDown
)
