2014-12-28 2 views
1

Я работаю над виджетами UI на пару дней и боролся за большую часть этого с проблемой, которая на первый взгляд казалась такой тривиальной!Создание пользовательского масштабируемого слайдера - процесс

Задача состояла в том, чтобы реализовать линию времени, которая может быть масштабирована по горизонтали. Просто!

Везде, где мышь находится горизонтально вдоль временной шкалы, должна удерживать линию, где она находится при масштабировании, и линия времени должна уменьшаться от этой точки. Тем не менее, относительно просто на поверхности!

Сложная часть, я обнаружил, искажала длину линии и значения «временной шкалы», поскольку она увеличивала свои относительные значения «пикселя» в виджетах и ​​обновляла полосу прокрутки относительно любого масштабирования и коррекции место.

Это изображение иллюстрирует задачу:

Image overview of problem

реализация была в Qt и С ++, однако вызов и мой вопрос больше о процессе решения проблемы. (Извините мои неправильные теги).

Мой вопрос: (A) Как бы вы нарушили эту проблему, чтобы прийти к решению и реализации. (B) Как бы вы приблизились к «изучению» шагов для решения этой и подобных проблем.

Спасибо,

Если я могу прояснить проблему дальше, дайте мне знать (возможно общение с проблемой является проблема :))

+0

Вы хотите изменить ширину горизонтального слайда, не меняя его масштаб? – kiwixz

+0

Разве это не просто настройка диапазона в обработчике событий и шаг, если вы тоже хотите изменить этот шаг? Если это так, это всего лишь один метод для реализации, не так ли? – lpapp

+0

@iKiWiXz - Что вы подразумеваете под «горизонтальным слайдом»? – cdevelop

ответ

0

Вы должны переопределить «событие масштабирования» и рассчитать новые диапазоны и Единственный шаг.

class ZoomSlider : public QSlider 
{ 
    Q_OBJECT 
    pubic: 
     explicit ZoomSlider(QWidget *parent = Q_NULLPTR) : QSlider(parent) {} 
    protected: 
     void wheelEvent(QWheelEvent *event) 
     { 
      // Calculate x, y and z from event 
      setRange(x, y); 
      setSingleStep(z); 
     } 
}; 
+0

Благодаря Ipapp, моя текущая реализация расширяет QWidget. У него есть пользовательский paintEvent для рисования линии и ее тиков, где изменяется расположение и расстояние между тиками, чтобы создать впечатление о временной шкале, прокручивающейся через «зритель» (черный ящик изображения в оригинальной записи) при масштабировании или перемещении прокрутки бар. Вы предполагаете, что он работает с QSlider? – cdevelop

+0

@cdevelop: возможно, я не понял ваш вопрос. :) Почему вы внедрили свой собственный слайдер? Что случилось с обработкой событий QSlider +? – lpapp

+0

Основываясь на моем ограниченном опыте Qt, я выбрал пользовательский интерфейс. Подходите ли вы к визуальному эффекту, который я проиллюстрировал? – cdevelop

Смежные вопросы