Use QT slider value in a python calculation?
-
Hi,
I just started using Qt designer on friday, looked at some youtube tutorials and i really like it.
I have a pile of python code - i used to run it and either change variables in the code or using user input but I'd like to add a really simple UI. To practice a bit - I created a simple widget with two sliders and linked them to two text boxes. I then created the Python code using my command prompt. I've spent the afternoon googling but can't seem to find an example that shows me how to take the slider values (or dials, or whatever) and use them in a simple calculation.
What is the name of the Slider variable?
Thanks in advance.
@from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: sclass Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(812, 576)
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.horizontalSlider = QtGui.QSlider(Form)
self.horizontalSlider.setGeometry(QtCore.QRect(60, 220, 160, 21))
self.horizontalSlider.setMinimum(-179)
self.horizontalSlider.setMaximum(179)
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName(_fromUtf8("horizontalSlider"))
self.verticalSlider = QtGui.QSlider(Form)
self.verticalSlider.setGeometry(QtCore.QRect(300, 160, 21, 160))
self.verticalSlider.setMinimum(0)
self.verticalSlider.setMaximum(90)
self.verticalSlider.setOrientation(QtCore.Qt.Vertical)
self.verticalSlider.setObjectName(_fromUtf8("verticalSlider"))
self.label = QtGui.QLabel(Form)
self.label.setGeometry(QtCore.QRect(80, 170, 111, 41))
self.label.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
self.label.setObjectName(_fromUtf8("label"))
self.label_2 = QtGui.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(290, 110, 53, 16))
self.label_2.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setObjectName(_fromUtf8("label_2"))self.retranslateUi(Form) QtCore.QObject.connect(self.horizontalSlider, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.label.setNum) QtCore.QObject.connect(self.verticalSlider, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.label_2.setNum) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): pass
if name == "main":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())@ -
I've been working on this and changed it slightly - i also added a seperate main function. i added ok and cancel buttons to see if they could give me a clue - I think im missing a exec_() but have no idea where to put it. I'm also not sure where to put the print ui.horizontalSlider.value() and print ui.verticalSlider.value() - in main? I need to access these values in multiple calculations, in multiple functions.
@from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: sclass Ui_Dialog(object):
def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(682, 539) Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.buttonBox = QtGui.QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QtCore.QRect(10, 440, 621, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.horizontalSlider = QtGui.QSlider(Dialog) self.horizontalSlider.setGeometry(QtCore.QRect(60, 190, 160, 21)) self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal) self.horizontalSlider.setObjectName(_fromUtf8("horizontalSlider")) self.verticalSlider = QtGui.QSlider(Dialog) self.verticalSlider.setGeometry(QtCore.QRect(360, 140, 21, 160)) self.verticalSlider.setOrientation(QtCore.Qt.Vertical) self.verticalSlider.setObjectName(_fromUtf8("verticalSlider")) self.label = QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(110, 140, 53, 16)) self.label.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8)) self.label.setObjectName(_fromUtf8("label")) self.label_2 = QtGui.QLabel(Dialog) self.label_2.setGeometry(QtCore.QRect(340, 90, 53, 16)) self.label_2.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setObjectName(_fromUtf8("label_2")) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.horizontalSlider, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.label.setNum) QtCore.QObject.connect(self.verticalSlider, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.label_2.setNum) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): pass@
And the main function
@
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from MIMIC_ver1 import Ui_Dialog
import sys, osclass Dialog(QDialog, Ui_Dialog):
def init(self):
QDialog.init(self)
self.setupUi(self)def main():
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
Dialog.exec_()
sys.exit(app.exec_())
print ui.horizontalSlider.value()
print ui.verticalSlider.value()if name == 'main':
main()
@ -
Hi,
Are your calculation functions in a library ? If so I would suggest the following:
- Create a QObject to manage your various calculation logic
- Give that QObject slots to get the values from the sliders
- Use signal/slots to send the values from your UI to that object
- Add slots to the object to start the calculations
- Be aware that if the calculations are heavy that simple approach might freeze your UI
In a second round you might be interested by QtConcurrent for the math part.
Hope it helps
-
Thanks for the reply - my calculations are in python classes and functions that i created myself. They are variables that are entered in the user-input stage like this
@
a = (float(raw_input('Enter angle of rotation'))
@I would like to make it so the slider in Qt becomes the method of user input. I've been searching for ages and amazed how rarely it comes up - I must be missing something simple or misunderstanding.
-
Hi All,
I'm still struggling with this one. here's a different example I've been using. I added the print function - so now it is printing the slider value for me. I have a few questions though -
-
I don't see how it's getting the slider value - in the example they pass 'value' but value isn't defined anywhere. Is it a hardcoded function in QT?
-
Say for example i wanted to use the slider value in loads of calculations - do i just use value?
-
how do I make it the final slider value? Add an ok option?
Thanks in advance - Conor.
@
#!/usr/bin/python-- coding: utf-8 --
"""
ZetCode PyQt4 tutorialThis example shows a QtGui.QSlider widget.
author: Jan Bodnar
website: zetcode.com
last edited: September 2011
"""import sys
from PyQt4 import QtGui, QtCoreclass Example(QtGui.QWidget):
def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): sld = QtGui.QSlider(QtCore.Qt.Horizontal, self) sld.setFocusPolicy(QtCore.Qt.NoFocus) sld.setGeometry(30, 40, 100, 30) sld.valueChanged[int].connect(self.changeValue) self.label = QtGui.QLabel(self) self.label.setPixmap(QtGui.QPixmap('mute.png')) self.label.setGeometry(160, 40, 80, 30) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('QtGui.QSlider') self.show() def changeValue(self, value): print value
def main():
app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
if name == 'main':
main()
@ -
-
It's because QSlider has a signal called (C++ style)
@void valueChanged(int value);@
So your slot must have the same or less argument. Since you are using python, you don't have to worry the same way about types than you do with C++
For your slots, you'd better use something meaning full like:
@ sld.valueChanged[int].connect(self.setRotationAngle)def setRotationAngle(self, angle)
### Do the updates then start your calculations
@That will work the same and your code will be easier to read.
I'm not sure understand question number 3 correctly. If you are thinking about the slider range i.e. 0-359° then you can simply set the slider range
@self.sld.setRange(0, 359)@ -
I get you - thanks for that.
In Question No. 3 I meant that is there a way to use only the final value of the slider. At present it prints every value it slides through on the way to the user defined setting.
I suppose I need an ok button to signify 'final value'?
-
If you only wish to do your calculation once the user has set all input variables, then indeed, have a button that says something like: tr("Start").
You can then do things a bit differently: you have a "setup" widget containing your sliders and other controls, at the bottom you have the start button that is connected to a slot. In this slot, you query the values of the different sliders and other useful input widgets and do your calculation. Don't forget to give the user some feedback i.e. QProgressDialog to let him know that something is being done.