使用drawComplexControl检索QSliderHandle图像

时间:2019-03-05 08:25:52

标签: c++ qt qslider qstyle

今天,我试图为QSlider手柄拍照,以便在带有两个手柄的专用QSlider小部件中使用它。

这与以下问题有点类似:Range slider in Qt (two handles in a QSlider)

对于完整的解决方案,我不能使用简单的图像文件。我尝试通过使用QSlider函数创建drawComplexControl的图像,但是它基本上给我留下了黑色图像。

我在这里做错了什么?对我来说似乎很简单,但是却无法正常工作。

#include <QApplication>
#include <QPushButton>
#include <QPainter>
#include <QStyleOptionSlider>

int main(int argc, char** args) {
    QApplication app(argc, args);
    auto slider = new QSlider;
    slider->setOrientation(Qt::Orientation::Horizontal);
    slider->show();

    auto btn = new QPushButton("Create Image");
    QObject::connect(btn, &QPushButton::clicked, [&] {
        auto style = QApplication::style();
        QStyleOptionSlider sliderOptions;
        QPixmap pix(slider->size());
        auto painter = new QPainter();
        painter->begin(&pix);
        style->drawComplexControl(QStyle::CC_Slider, &sliderOptions, painter, slider);

        pix.save("SliderImage.png");
        auto handleRect = style->subControlRect(QStyle::ComplexControl::CC_Slider, &sliderOptions, QStyle::SubControl::SC_SliderHandle, slider);
        QPixmap handlePix = pix.copy(handleRect);
        handlePix.save("SliderHandleImage.png");

        painter->end();
    });
    btn->show();
    app.exec();
}

1 个答案:

答案 0 :(得分:1)

解决方案非常简单。我只是忘了补充:

sliderOption.initFrom(slider);