Ручка пользовательского QSlider выходит за рамки при использовании QProxyStyleC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Ручка пользовательского QSlider выходит за рамки при использовании QProxyStyle

Сообщение Гость »

В большинстве примеров настройка ползунка 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Дескриптор QSlider и QProxyStyle
    Гость » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Гость
  • Ручка QSlider скрывается при изменении фона канавки.
    Гость » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Гость
  • Сравнить функцию Windows CompareObjecthandles (ручка, ручка)
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Pytorch быстрее r-cnn, нет ошибки возвращаемого значения изображения ограничивающей рамки (все ограничивающие рамки долж
    Anonymous » » в форуме Python
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Как настроить цвет рамки рамки, чтобы он менялся в зависимости от темы приложения?
    Anonymous » » в форуме C#
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»