У меня есть диалог Qt, и в нем есть ползунок, когда диалог инициализируется, ползунку будет задано значение. Чтобы напомнить пользователю, что такое значение по умолчанию, я хочу добавить метку в слайдер, просто нарисуйте линию или треугольник над дескриптором. Здесь ползунок должен быть типа QSlider, это означает, что я не могу реализовать настраиваемый элемент управления, полученный из QSlider. Есть ли способ понять это?Как добавить галочку на слайдер, если он не может наследовать QSlider
ответ
Я не ясно, почему вы не можете получить контроль от 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"
спасибо за упоминание 'QStyle :: sliderPositionFromValue' – Micka
Почему вам нужно наследовать QSlider для доступа к его общедоступным методам?
http://doc.trolltech.com/4.7/qslider.html
Вы можете просто позвонить его setTickPosition() в вашем приложении.
Извините, я не ясно изложил свой вопрос. Я имею в виду, например, если значение ползунка равно 30, есть только отметка в позиции 30. – Royt
Самый простой способ я могу думать ОТКЛ:
Добавить 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();
}
Вы имеете в виду, что ручка расположена где-то вдоль диапазона слайдера, но вы хотите, чтобы подчеркнуть другую позицию, привлекая некоторые вид маркера? – Masci
@Masci: Я хочу подчеркнуть значение по умолчанию слайдера, когда пользователь перетаскивает дескриптор, они все еще могут видеть исходное значение слайдера, поскольку есть отметка для начального значения. – Royt
ОК, теперь ясно – Masci