Advertisement
Guest User

Untitled

a guest
Jun 30th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <QtWidgets>
  2.  
  3. class RangedSlider : public QSlider {
  4.     int mRangeMin, mRangeMax;
  5. public:
  6.     explicit RangedSlider(Qt::Orientation orientation, QWidget* parent= nullptr):
  7.         QSlider(orientation, parent),mRangeMin(minimum()),mRangeMax(maximum()) {}
  8.     explicit RangedSlider(QWidget* parent=nullptr):RangedSlider(Qt::Vertical, parent){}
  9.    
  10.     void sliderChange(SliderChange change) override {
  11.         if(change == QAbstractSlider::SliderValueChange) {
  12.             fixValue();
  13.         }
  14.         QSlider::sliderChange(change);
  15.     }
  16.    
  17.     void setRangeMin(int rangeMin) { this->mRangeMin = rangeMin; fixValue(); }
  18.     void setRangeMax(int rangeMax) { this->mRangeMax = rangeMax; fixValue(); }
  19.    
  20.     int rangeMin() const { return mRangeMin; }
  21.     int rangeMax() const { return mRangeMax; }
  22. private:
  23.     void fixValue() {
  24.         int correctValue = value();
  25.         if(value() < mRangeMin)
  26.             correctValue = mRangeMin;
  27.         if(value() > mRangeMax)
  28.             correctValue = mRangeMax;
  29.         if(correctValue!= value()){
  30.             //this will emit value changed with the correct value
  31.             setValue(correctValue);
  32.             //a hack to stop QSlider from emiting valueChanged with the
  33.             //old value
  34.             blockSignals(true);
  35.             QObject signalSource;
  36.             //unblock signals for this object as soon as the event loop is
  37.             //reached again
  38.             QObject::connect(&signalSource, &QObject::destroyed, this, [=] {
  39.                 blockSignals(false);
  40.             }, Qt::QueuedConnection);
  41.         }
  42.     }
  43. };
  44.  
  45. int main(int argc, char* argv[]) {
  46.     QApplication a(argc, argv);
  47.     QWidget widget;
  48.     QVBoxLayout layout(&widget);
  49.     RangedSlider slider;
  50.     QObject::connect(&slider, &QSlider::valueChanged, [&slider](int value){
  51.         qDebug() << value << " " << slider.value();
  52.     });
  53.     slider.setRangeMin(10);
  54.     slider.setRangeMax(80);
  55.     layout.addWidget(&slider);
  56.     widget.show();
  57.    
  58.     return a.exec();
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement