Russian Qt Forum
Ноябрь 26, 2024, 01:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: виджет Qdial  (Прочитано 4414 раз)
KosToZyB
Гость
« : Ноябрь 06, 2010, 09:03 »

Есть виджет QDial (крутящаяся головка). Значение 0 у этой головки находится в нижней части круга (180 градусов). Мне необходимо, что бы значение 0 было в верхней части круга (0 градусов). Возможно ли так сделать? или как можно виджет повернуть на 180 градусов?
Записан
marbius
Гость
« Ответ #1 : Ноябрь 06, 2010, 12:14 »

Не могу гарантировать, что такой подход идеологически правильный, но можно попробовать переопределить QDial::paintEvent и написать такой вот код:
Код
C++ (Qt)
   QStylePainter p(this);
   p.rotate(180);
   p.translate(-width(),-height());
   QStyleOptionSlider option;
   initStyleOption(&option);
   p.drawComplexControl(QStyle::CC_Dial, option);
 
Записан
marbius
Гость
« Ответ #2 : Ноябрь 06, 2010, 13:03 »

Вот что лично у меня получилось в итоге:
Код
C++ (Qt)
class myDial : public QDial
{
   Q_OBJECT
 
public:
   explicit myDial(QWidget *parent = 0):
       QDial(parent)
   {   setInvertedControls(true);
       setInvertedAppearance(true);
   }
 
private:
 
   QMouseEvent* invertMousePos (QMouseEvent *me)
   {   QPoint pt(width()-me->pos().x(),height()-me->pos().y());
       QMouseEvent *m=new QMouseEvent(me->type(),pt,me->button(),me->buttons(),me->modifiers());
       return m;
   }
 
   void paintEvent(QPaintEvent *pe)
   {   QStylePainter p(this);
       p.rotate(180);
       p.translate(-width(),-height());
       QStyleOptionSlider option;
       initStyleOption(&option);
       p.drawComplexControl(QStyle::CC_Dial, option);
   }
   void mousePressEvent(QMouseEvent *me)
   {   QMouseEvent *m=invertMousePos(me);
       QDial::mousePressEvent(m);
       delete m;
       me->ignore();
   }
 
   void mouseReleaseEvent(QMouseEvent *me)
   {   QMouseEvent *m=invertMousePos(me);
       QDial::mouseReleaseEvent(m);
       delete m;
       me->ignore();
   }
 
   void mouseMoveEvent(QMouseEvent *me)
   {   QMouseEvent *m=invertMousePos(me);
       QDial::mouseMoveEvent(m);
       delete m;
       me->ignore();
   }
 
};
 
#include "main.moc"
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   myDial *dial=new myDial();
   dial->show();
 
   return a.exec();
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.301 секунд. Запросов: 21.