如果无法继承QSlider,如何在滑块上添加刻度线

Roy*_*oyt 2 qt qslider qt4.7

我有一个Qt对话框,其中有一个滑块,当初始化对话框时,滑块将被设置一个值.为了提醒用户什么是默认值,我想在滑块上添加一个标记,只需在手柄上方画一条线或三角形.这里,滑块应该是QSlider类型,这意味着我无法实现从QSlider派生的自定义控件.有没有办法实现它?

Dav*_*eer 5

我不清楚为什么你不能从中获取控件QSlider.您仍然可以将其视为a 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"
Run Code Online (Sandbox Code Playgroud)