Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: KosToZyB от Ноябрь 06, 2010, 09:03



Название: виджет Qdial
Отправлено: KosToZyB от Ноябрь 06, 2010, 09:03
Есть виджет QDial (крутящаяся головка). Значение 0 у этой головки находится в нижней части круга (180 градусов). Мне необходимо, что бы значение 0 было в верхней части круга (0 градусов). Возможно ли так сделать? или как можно виджет повернуть на 180 градусов?


Название: Re: виджет Qdial
Отправлено: marbius от Ноябрь 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);
 


Название: Re: виджет Qdial
Отправлено: marbius от Ноябрь 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();
}