Qtダイアログがあり、その中にスライダーがあります。ダイアログが初期化されると、スライダーに値が設定されます。ユーザーにデフォルト値を思い出させるために、スライダーにマークを追加したいと思います。ハンドルの上に線または三角形を描くだけです。ここでは、スライダーは QSlider タイプである必要があります。つまり、QSlider から派生したカスタマイズされたコントロールを実装することはできません。それを実現する方法はありますか?
5691 次
3 に答える
7
からコントロールを派生できない理由がわかりません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"
于 2012-03-21T13:15:01.743 に答える
2
私が考えることができる最も簡単な方法は次のとおりです。
QSlider に QSlider を追加します (レイアウトや QFrame で行うように)。上のスライダーが現在のスライダー (クリック可能なもの) になります。下のスライダーは、「デフォルトの目盛り位置」値になります。
#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();
}
于 2012-03-21T11:33:40.347 に答える
0
public メソッドにアクセスするために QSlider を継承する必要があるのはなぜですか?
http://doc.trolltech.com/4.7/qslider.html
アプリでsetTickPosition()を呼び出すだけです。
于 2012-03-21T10:31:00.230 に答える