Qt 대화 상자가 있고 슬라이더가있는 경우 대화 상자가 초기화되면 슬라이더에 값이 설정됩니다. 사용자에게 기본 값을 상기시키기 위해 슬라이더에 표시를 추가하고 핸들 위에 선 또는 삼각형을 그립니다. 여기서 슬라이더는 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
가장 쉬운 방법은 다음과 같습니다 (당신이 레이아웃과 QFrames와 함께 할 것처럼)
이 QSlider에 QSlider를 추가합니다. 위의 슬라이더는 현재 슬라이더입니다 (클릭 가능한 슬라이더). 아래의 슬라이더가 "기본 눈금 위치"값이됩니다. 당신이 QSlider
에서 컨트롤을 파생 할 수없는 이유
#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