Дескриптор QSlider и QProxyStyleC++

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

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

По умолчанию QSlider перемещает свой дескриптор на значение, принадлежащее свойству pageStep(), при щелчке мыши. Чтобы дескриптор прыгал непосредственно в точке щелчка мыши, нам нужно создать новый класс, унаследованный QSlider.
.h

Код: Выделить всё

#ifndef QIMPROVEDSLIDER_H
#define QIMPROVEDSLIDER_H

#include 

class QImprovedSlider : public QSlider
{
Q_OBJECT
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
public:
explicit QImprovedSlider(QWidget *parent = 0);

signals:
void clicked(int value) const;

};

#endif // QIMPROVEDSLIDER_H
.cpp

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include "QImprovedSlider.h"

class QImprovedSliderStyle : public QProxyStyle
{
public:
using QProxyStyle::QProxyStyle;
int styleHint(QStyle::StyleHint hint, const QStyleOption* option = 0,
const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const
{
if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
return (Qt::LeftButton | Qt::MidButton | Qt::RightButton);
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};

QImprovedSlider::QImprovedSlider(QWidget *parent) :
QSlider(parent)
{
setStyle(new QImprovedSliderStyle(this->style()));
}

void QImprovedSlider::mousePressEvent(QMouseEvent *event) {
QStyleOptionSlider opt;
initStyleOption(&opt);
QRect sr = style()->subControlRect(QStyle::CC_Slider,
&opt,
QStyle::SC_SliderHandle,
this);
qDebug() button() == Qt::LeftButton) {
if (orientation() == Qt::Vertical)
setValue(minimum() + ((maximum()-minimum()) * (height()-event->y())) / height() ) ;
else
setValue(minimum() + ((maximum()-minimum()) * event->x()) / width() ) ;
}
QSlider::mousePressEvent(event);
}

void QImprovedSlider::mouseReleaseEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
emit clicked(value());
QSlider::mouseReleaseEvent(event);
}
}
QImprovedSliderStyle делает перетаскивание дескриптора более плавным, но таким образом событие вызывается, даже когда щелчок попадает внутрь дескриптора, а условие !sr.contains(event->pos( )) следует избегать этого.


Подробнее здесь: https://stackoverflow.com/questions/414 ... proxystyle
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ручка пользовательского QSlider выходит за рамки при использовании QProxyStyle
    Гость » » в форуме C++
    0 Ответы
    53 Просмотры
    Последнее сообщение Гость
  • Отправить сигнал из Qt QSlider в слот QLineEdit
    Anonymous » » в форуме C++
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Отправить сигнал из QSlider в слот QLineEdit
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как изменить цвет маркера QSlider в зависимости от его положения
    Гость » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Гость
  • Ручка QSlider скрывается при изменении фона канавки.
    Гость » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Гость

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