0

What is the maximum value of QSlider, in the datasheet, it is just mentioned as int.

I tried with "1000000". but the Slider starts bugging.

QSlider.setMaximum(1000000);

Image with the bug, the blue color and the cursor don't move well at same speed, if the number is at max : 999999999, the cursor don't move at all. enter image description here

when I put : max at : 650000 that works very well. That is perhaps an OS problem, I am using IOS.. enter image description here

By the way, here is an update of code, works fine with 100000 x 2 possible values:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

MAXVAL = 650000

class RangeSliderClass(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()

        self.minTime = 0
        self.maxTime = 0
        self.minRangeTime = 0
        self.maxRangeTime = 0
        self.middleTime = self.getMiddleTime()
        self.halfTimeInterval = self.middleTime - self.minTime

        self.sliderMin = MAXVAL
        self.sliderMax = MAXVAL

        self.setupUi(self)

    def setupUi(self, RangeSlider):
        RangeSlider.setObjectName("RangeSlider")
        RangeSlider.resize(631, 65)
        RangeSlider.setMaximumSize(QtCore.QSize(16777215, 65))
        self.RangeBarVLayout = QtWidgets.QVBoxLayout(RangeSlider)
        self.RangeBarVLayout.setContentsMargins(5, 0, 5, 0)
        self.RangeBarVLayout.setSpacing(0)
        self.RangeBarVLayout.setObjectName("RangeBarVLayout")
        self.datesFrame = QtWidgets.QFrame(RangeSlider)
        self.datesFrame.setMaximumSize(QtCore.QSize(16777215, 28))
        self.datesFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.datesFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.datesFrame.setObjectName("datesFrame")
        self.datesHLayout = QtWidgets.QHBoxLayout(self.datesFrame)
        self.datesHLayout.setContentsMargins(5, 2, 5, 2)
        self.datesHLayout.setObjectName("datesHLayout")

        ## startTime Calendar Widget
        self.startTime = QtWidgets.QDateTimeEdit(self.datesFrame)
        self.startTime.setMinimumSize(QtCore.QSize(183, 0))
        self.startTime.setMaximumSize(QtCore.QSize(185, 24))

        self.startTime.setDate(QtCore.QDate.currentDate().addDays(-1))

        self.startTime.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(2999, 12, 31), QtCore.QTime(23, 59, 59)))
        self.startTime.setMaximumDate(QtCore.QDate(2999, 12, 31))
        self.startTime.setMinimumDate(QtCore.QDate(2000, 1, 1))
        self.startTime.setCalendarPopup(True)
        self.startTime.setObjectName("startTime")
        self.startTime.dateChanged.connect(self.startDateChangeHandler)
        self.datesHLayout.addWidget(self.startTime)

        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.datesHLayout.addItem(spacerItem)

        ## entTime Calendar Widget
        self.endTime = QtWidgets.QDateTimeEdit(self.datesFrame)
        self.endTime.setMinimumSize(QtCore.QSize(183, 0))
        self.endTime.setMaximumSize(QtCore.QSize(185, 24))
        self.endTime.setDate(QtCore.QDate.currentDate())
        self.endTime.setMaximumDate(QtCore.QDate(2999, 12, 31))
        self.endTime.setMinimumDate(QtCore.QDate(2000, 1, 1))
        self.endTime.setCalendarPopup(True)
        self.endTime.setObjectName("endTime")
        self.endTime.dateChanged.connect(self.endDateChangeHandler)
        self.datesHLayout.addWidget(self.endTime)

        ## Init Time
        self.minTime = self.startTime.dateTime().toTime_t()
        self.maxTime = self.endTime.dateTime().toTime_t()
        self.minRangeTime = self.minTime
        self.maxRangeTime = self.maxTime
        self.middleTime = self.getMiddleTime()
        self.halfTimeInterval = self.middleTime - self.minTime

        self.RangeBarVLayout.addWidget(self.datesFrame)
        self.slidersFrame = QtWidgets.QFrame(RangeSlider)
        self.slidersFrame.setMaximumSize(QtCore.QSize(16777215, 25))
        self.slidersFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.slidersFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.slidersFrame.setObjectName("slidersFrame")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.slidersFrame)
        self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
        self.horizontalLayout.setContentsMargins(5, 2, 5, 2)
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")

        ## Start Slider Widget
        self.startSlider = QtWidgets.QSlider(self.slidersFrame)
        self.startSlider.setMaximum(self.sliderMin)
        self.startSlider.setMinimumSize(QtCore.QSize(100, 5))
        self.startSlider.setMaximumSize(QtCore.QSize(16777215, 10))
        font = QtGui.QFont()
        font.setKerning(True)
        self.startSlider.setFont(font)
        self.startSlider.setAcceptDrops(False)
        self.startSlider.setAutoFillBackground(False)
        self.startSlider.setOrientation(QtCore.Qt.Horizontal)
        self.startSlider.setInvertedAppearance(True)
        self.startSlider.setObjectName("startSlider")
        self.startSlider.setValue(MAXVAL)
        self.startSlider.sliderReleased.connect(self.startSliderHandler)
        self.horizontalLayout.addWidget(self.startSlider)

        ## End Slider Widget
        self.endSlider = QtWidgets.QSlider(self.slidersFrame)
        self.endSlider.setMaximum(MAXVAL)
        self.endSlider.setMinimumSize(QtCore.QSize(100, 5))
        self.endSlider.setMaximumSize(QtCore.QSize(16777215, 10))
        self.endSlider.setTracking(True)
        self.endSlider.setOrientation(QtCore.Qt.Horizontal)
        self.endSlider.setObjectName("endSlider")
        self.endSlider.setValue(self.sliderMax)
        self.endSlider.sliderReleased.connect(self.endSliderHandler)
        self.horizontalLayout.addWidget(self.endSlider)

        self.RangeBarVLayout.addWidget(self.slidersFrame)

        self.retranslateUi(RangeSlider)
        QtCore.QMetaObject.connectSlotsByName(RangeSlider)

        self.show()

    def getMiddleTime(self, maxTime = None, minTime = None):
        if minTime == None :
            minTime = self.minRangeTime
        if maxTime == None :
            maxTime = self.maxRangeTime
        return (minTime + maxTime)/2

    def getRangeTime(self):
        return self.minRangeTime, self.maxRangeTime

    def startSliderHandler(self):
        self.sliderMin = self.startSlider.value()

        self.minRangeTime = int(self.middleTime - self.halfTimeInterval * self.sliderMin / MAXVAL)
        #print("\n\nNew Min Time Range : ", self.minRangeTime, " Min : ",  self.minTime, "Minddle : ", self.middleTime)

    def endSliderHandler(self):
        self.sliderMax = self.endSlider.value()

        self.maxRangeTime = int(self.middleTime + self.halfTimeInterval * self.sliderMax / MAXVAL)
        print("\n\nNew Min Time Range : ", self.maxRangeTime, " Max : ",  self.maxTime, "Minddle : ", self.middleTime)

    def startDateChangeHandler(self):
        self.minTime = self.startTime.dateTime().toTime_t()
        #print("MinTime range : ", self.minTime)

    def endDateChangeHandler(self):
        self.maxTime = self.endTime.dateTime().toTime_t()
        #print("MaxTime range : ", self.maxTime)

    def retranslateUi(self, RangeSlider):
        _translate = QtCore.QCoreApplication.translate
        RangeSlider.setWindowTitle(_translate("RangeSlider", "Time interval"))
        self.startTime.setDisplayFormat(_translate("RangeSlider", "dd/MM/yyyy  HH:mm:ss .zz"))
        self.endTime.setDisplayFormat(_translate("RangeSlider", "dd/MM/yyyy  HH:mm:ss .zz"))

app = QtWidgets.QApplication(sys.argv)
awindow = RangeSliderClass()
sys.exit(app.exec_())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
gxmad
  • 1,650
  • 4
  • 23
  • 29
  • This is the Maximun of QSlider value: `999999999` – Farhad Sep 14 '17 at 12:15
  • excerption from doc.qt.io [QSlider only provides integer ranges. Note that although QSlider handles very large numbers, it becomes difficult for users to use a slider accurately for very large ranges.] but here is nothing about maximum value. – Leri Gogsadze Sep 14 '17 at 12:16
  • Yeah I saw that, the slider don't even work with less than 1000000 < 999999999 I am using it at 100000 but what is the best useable value – gxmad Sep 14 '17 at 12:30
  • @J.Doe I don't get it my friend, it's working for me. I post an image in my answer, you can see i set max value with 9 digits. – Farhad Sep 14 '17 at 12:40
  • @BELLOULGAYA. After you call `slider.setMaximum()`, what does `slider.maximum()` return? Try gradually increasing the maximum to see what the actual returned value is. – ekhumoro Sep 14 '17 at 13:22
  • @ekhumoro here is the code above. – gxmad Sep 14 '17 at 13:41
  • I cannot reproduce the problem using python 3.6.2, qt 5.9.1, and pyqt 5.9 on linux. I suppose this must be some bug/limitation that only affects iOS. A work-around would be to use something like `100000`, and then multiply by an appropriate factor to get the required value. For very high maximum slider values, the user is not going to be able to select every intermediate value anyway. If they need an exact value, they can use the spin-boxes. – ekhumoro Sep 14 '17 at 14:04
  • I am using pyQt 5.9.1 too, Yes perhaps that is a mac limitation. that is enough for my application I think, just I wanted to verify this point. for the code it is for free, if someone needs it, I saw that codes for rangeslider are not that present on web. – gxmad Sep 14 '17 at 14:30

2 Answers2

1

You can set QSlider maximum value with 9 digits.

QSlider.setMaximum(999999999);

QSlider image

Farhad
  • 4,119
  • 8
  • 43
  • 66
  • 1
    This only applies to Qt Designer. It can be set to a higher value in code, but the actual resulting value is not well-defined. It may get truncated, or even overflow (depending on which version of python and/or qt you are using, amongst other things). – ekhumoro Sep 14 '17 at 13:05
  • I just try it with code in cpp file: `ui->horizontalSlider->setValue(999999999);` working. I am using Qt 5.7. – Farhad Sep 14 '17 at 13:07
  • I didn't say it doesn't work - I said it wasn't the true maximum. Try it with `9999999999` (or higher values) and see what `maximum()` returns. – ekhumoro Sep 14 '17 at 13:12
  • It's weird `setMaximum(999999999);` 9 digits, returning 9 digits `999999999` But `setMaximum(9999999999);` 10 digits, returning `1410065407` – Farhad Sep 14 '17 at 13:17
  • 1
    And for 11 digits: `1215752191`; 12 digits: `-727379969`; 13 digits: `1316134911`; 14 digits: `276447231` ... – ekhumoro Sep 14 '17 at 13:21
  • @ekhumoro the max I get with `slider.maximum()` is 999999999, as expected. but it is acting weird as before. – gxmad Sep 14 '17 at 13:26
  • @BELLOULGAYA. Please add a simple, self-contained code example to your question, so that others can try to reproduce the problem. It's likely that there may be platform-specific differences, so some testing is required. – ekhumoro Sep 14 '17 at 13:32
  • @BELLOULGAYA If my answer was helpful could you accept it, thanks. – Farhad Oct 06 '17 at 10:07
1

The answer of @aghilpro is not incorrect on Qt Designer the limit is 999999999 (9 digits)

But QSlider inherits QAbstractSlider and on definition of properties we have:

...
Q_PROPERTY(int minimum READ minimum WRITE setMinimum)
Q_PROPERTY(int maximum READ maximum WRITE setMaximum)
...

Then the max int value is 2,147,483,647 (10 digits) then 9999999999 overflow that value;