В большинстве примеров настройка ползунка Qt выполняется следующим образом (с помощью таблицы стилей):
mySlider = new QSlider(centralWidget);
mySlider->setObjectName(QStringLiteral("mySlider"));
mySlider->setGeometry(QRect(645, 678, 110, 21));
mySlider->setOrientation(Qt::Horizontal);
mySlider->setStyleSheet("QSlider::groove:horizontal {background-image:url(:/main/graphics/mySliderBackround.png);}"
"QSlider::handle:horizontal {background-image:url(:/main/graphics/mySliderHandle.png); height:21px; width: 21px;}");
У меня это тоже отлично работает.
У меня ситуация, когда мне нужно программно установить фон, используя динамически создаваемое растровое изображение.
У меня это тоже отлично работает.
У меня есть ситуация, когда мне нужно программно установить фон, используя динамически создаваемое растровое изображение.
p>
Используя приведенный ниже код, я сделал это вот так. Проблема в том, что когда я использую Fedora Linux, этот слайдер работает нормально. Когда я работаю в OSX или Windows, ручка ползунка выходит за рамки.
Вот как это выглядит в OSX. Обратите внимание, как ручка выходит из паза. Левая часть настраивается с помощью таблицы стилей, правая — с помощью объекта Style, расположенного ниже.
[img]https: //i.stack.imgur.com/RAq8n.png[/img]
Создайте слайдер и назначьте стиль:
mySlider = new QSlider(centralWidget);
mySlider->setObjectName(QStringLiteral("mySlider"));
mySlider->setGeometry(QRect(645, 678, 110, 21));
mySlider->setOrientation(Qt::Horizontal);
mySlider->setStyle(new MySliderStyle(mySlider->style()));
Код пользовательского стиля слайдера:
Заголовок
#ifndef MYSTYLE_H
#define MYSTYLE_H
#include
#include
#include
#include
#include
#include
class MySliderStyle : public QProxyStyle
{
private:
QPixmap groovePixmap;
QPixmap handlePixmap;
public:
LightingSliderStyle(QStyle *style)
: QProxyStyle(style)
{
setColor(QColor::fromRgba(0));
this->handlePixmap = ;
this->grooveMaskPixmap = ;
}
void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const;
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;
void setColor(QColor color);
};
#endif // MYSTYLE_H
Реализация*
#include "MySliderStyle.h"
QRect MySliderStyle::subControlRect(ComplexControl control,
const QStyleOptionComplex *option,
SubControl subControl,
const QWidget *widget) const
{
QRect rect;
rect = QCommonStyle::subControlRect(control, option, subControl, widget);
if (control == CC_Slider && subControl == SC_SliderHandle)
{
// this is the exact pixel dimensions of the handle png files
rect.setWidth(21);
rect.setHeight(21);
}
else if (control == CC_Slider && subControl == SC_SliderGroove)
{
// this is the exact pixel dimensions of the slider png files
rect.setWidth(widget->width());
rect.setHeight(widget->height());
}
return rect;
}
void MySliderStyle::drawComplexControl(QStyle::ComplexControl control,
const QStyleOptionComplex *option,
QPainter *painter,
const QWidget *widget) const
{
if (control == CC_Slider)
{
if (const QStyleOptionSlider *slider = qstyleoption_cast(option))
{
QRect groove = subControlRect(CC_Slider, slider, SC_SliderGroove, widget);
QRect handle = subControlRect(CC_Slider, slider, SC_SliderHandle, widget);
if ((slider->subControls & SC_SliderGroove) && groove.isValid())
{
Qt::BGMode oldMode = painter->backgroundMode();
painter->setBackgroundMode(Qt::TransparentMode);
painter->drawPixmap(groove, groovePixmap);
painter->setBackgroundMode(oldMode);
}
if ((slider->subControls & SC_SliderHandle) && handle.isValid())
{
Qt::BGMode oldMode = painter->backgroundMode();
painter->setBackgroundMode(Qt::TransparentMode);
painter->drawPixmap(handle, handlePixmap);
painter->setBackgroundMode(oldMode);
}
}
}
else
{
QProxyStyle::drawComplexControl(control, option, painter, widget);
}
}
void MySliderStyle::setColor(QColor color)
{
QImage myGrooveImage;
//
// Code to create the custom pixmap
//
groovePixmap = QPixmap::fromImage(myGrooveImage);
}
Подробнее здесь: https://stackoverflow.com/questions/453 ... proxystyle
Ручка пользовательского QSlider выходит за рамки при использовании QProxyStyle ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как настроить цвет рамки рамки, чтобы он менялся в зависимости от темы приложения?
Anonymous » » в форуме C# - 0 Ответы
- 39 Просмотры
-
Последнее сообщение Anonymous
-