Название: виджет 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(); }
|