gpt4 book ai didi

qt - 如果不能继承 QSlider,如何向 slider 添加刻度线

转载 作者:行者123 更新时间:2023-12-01 12:35:42 27 4
gpt4 key购买 nike

我有一个 Qt 对话框,其中有一个 slider ,当对话框初始化时, slider 将被设置一个值。为了提醒用户什么是默认值,我想在 slider 上加一个标记,只要在 handle 上方画一条线或一个三角形即可。在这里, slider 应该是 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"

关于qt - 如果不能继承 QSlider,如何向 slider 添加刻度线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9802670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com