Как добавить метку в слайдер, если он не может наследовать QSlider - PullRequest
2 голосов
/ 21 марта 2012

У меня есть диалоговое окно Qt, и в нем есть ползунок, когда диалог инициализируется, ползунку будет присвоено значение.Чтобы напомнить пользователю, что является значением по умолчанию, я хочу добавить отметку к ползунку, просто нарисуйте линию или треугольник над ручкой.Здесь, слайдер должен быть типа QSlider, это означает, что я не могу реализовать настраиваемый элемент управления, полученный из QSlider.Есть ли способ это реализовать?

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Мне непонятно, почему вы не можете получить контроль от QSlider. Вы по-прежнему можете рассматривать его как QSlider, просто переопределив метод paintEvent. Приведенный ниже пример выглядит довольно глупо, визуально говоря, но вы можете использовать методы из QStyle, чтобы сделать его более естественным:

#include <QtGui>

class DefaultValueSlider : public QSlider {
  Q_OBJECT

 public:
  DefaultValueSlider(Qt::Orientation orientation, QWidget *parent = NULL)
    : QSlider(orientation, parent),
      default_value_(-1) {
    connect(this, SIGNAL(valueChanged(int)), SLOT(VerifyDefaultValue(int)));
  }

 protected:
  void paintEvent(QPaintEvent *ev) {
    int position = QStyle::sliderPositionFromValue(minimum(),
                                                   maximum(),
                                                   default_value_,
                                                   width());
    QPainter painter(this);
    painter.drawLine(position, 0, position, height());
    QSlider::paintEvent(ev);
  }

 private slots:
  void VerifyDefaultValue(int value){
    if (default_value_ == -1) {
      default_value_ = value;
      update();
    }
  }

 private:
  int default_value_;
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  DefaultValueSlider *slider = new DefaultValueSlider(Qt::Horizontal);
  slider->setValue(30);

  QWidget *w = new QWidget;
  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(slider);
  layout->addStretch(1);
  w->setLayout(layout);

  QMainWindow window;
  window.setCentralWidget(w);
  window.show();

  return app.exec();
}

#include "main.moc"
2 голосов
/ 21 марта 2012

Самый простой способ подумать:

Добавьте QSlider в QSlider (как вы делаете это с макетами и QFrames). Слайдер выше будет вашим текущим слайдером (кликабельным). Ползунок ниже будет вашим значением позиции по умолчанию.

#include <QApplication>
#include <QSlider>
#include <QVBoxLayout>

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    QSlider * defaultValueSlider = new QSlider();
    QSlider * valueSlider = new QSlider(defaultValueSlider);
    QVBoxLayout * lay = new QVBoxLayout(defaultValueSlider);
    lay->setContentsMargins(0, 0, 0, 0);
    lay->setSpacing(0);
    lay->addWidget(valueSlider);
    defaultValueSlider->setRange(0, 100);
    valueSlider->setRange(0, 100);
    defaultValueSlider->setValue(30);

    defaultValueSlider->show();

    return app.exec();
}

result

0 голосов
/ 21 марта 2012

Почему вам нужно наследовать QSlider для доступа к его публичным методам?

http://doc.trolltech.com/4.7/qslider.html

Вы можете просто вызвать его setTickPosition () в вашем приложении.

...