Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Globulus от Август 09, 2011, 18:42



Название: Повернуть QLabel относительно центра
Отправлено: Globulus от Август 09, 2011, 18:42
Здравствуйте!

Хочу повернуть QLabel, делаю вот так :

Код:

class MyLabel : public QLabel
{
  Q_OBJECT
  Q_PROPERTY (qreal rotation READ rotation WRITE setRotation)
...
};
 
void MyLabel::Rotate()
{
  
    m_anim1 = new  QPropertyAnimation(this,"rotation");
    m_anim1->setStartValue(qreal(-0));
    m_anim1->setEndValue(qreal(-360));
    m_anim1->setDuration(500);    
    m_anim1->start();
}


Ругается:

Код:
In member function 'virtual int MyLabel::qt_metacall(QMetaObject::Call, int, void**)':
error: 'rotation' was not declared in this scope
error: 'setRotation' was not declared in this scope

В чем дело и как вообще повернуть QLabel относительно центра (предположим QLabel содержит картинку) ?


Название: Re: Повернуть QLabel относительно центра
Отправлено: twp от Август 09, 2011, 18:53
хех, простым добавлением свойства можно вращать QLabel? Интересное решение :)


Название: Re: Повернуть QLabel относительно центра
Отправлено: Globulus от Август 09, 2011, 20:09
хех, простым добавлением свойства можно вращать QLabel? Интересное решение :)

Другие идеи?


Название: Re: Повернуть QLabel относительно центра
Отправлено: Etud от Август 09, 2011, 21:39
предположим картинка

Если картинку, пэйнтером рисуете и вращаете. Не пробовал.

QLabel - не знаю как повернуть.


Название: Re: Повернуть QLabel относительно центра
Отправлено: iroln от Август 09, 2011, 23:00
хех, простым добавлением свойства можно вращать QLabel? Интересное решение :)

Другие идеи?

Перегрузить метод paintEvent() и нарисовать всё с нужным углом поворота? Самое простое, что пришло в голову. :)

Примерно так:
Код
Python
 
from PySide.QtCore import *
from PySide.QtGui import *
 
class MyLabel(QLabel):
   def __init__(self):
       super(MyLabel, self).__init__()
       self._angle = 0
 
   def rotate(self, angle):
       self._angle = angle
 
   def paintEvent(self, event):
 
       painter = QPainter(self)
 
       painter.save()        
 
       w = self.width()
       h = self.height()
 
       painter.translate(w/2.0, h/2.0)
       painter.rotate(self._angle)
       painter.translate(-w/2.0, -h/2.0)
 
       painter.drawText(self.rect(), self.alignment(), self.text())
       painter.restore()
 
       self.drawFrame(painter)
   pass
 
if __name__ == '__main__':
   import sys
 
   app = QApplication(sys.argv)
 
   label = MyLabel()
   label.setAlignment(Qt.AlignCenter)
   label.setText('Hello, World!')
   label.rotate(35)
 
   label.show()
   label.resize(100, 100)
   app.exec_()
 

(http://lostpic.net/images/1f9f7bf4081138c13aa4ef007833504e.png)


Название: Re: Повернуть QLabel относительно центра
Отправлено: m_ax от Август 10, 2011, 01:47
Вообще это уже обсуждалось http://www.prog.org.ru/topic_10538_0.html#lastPost (http://www.prog.org.ru/topic_10538_0.html#lastPost)
Более допилинный вариант RotatedLabel можно найти в библиотеке lightplot2d http://code.google.com/p/lightplot2d/downloads/list (http://code.google.com/p/lightplot2d/downloads/list)


Название: Re: Повернуть QLabel относительно центра
Отправлено: lesav от Август 10, 2011, 12:04
А если центр вращения будет в центре картинки, то надо будет корректировать положение картинки относительно угла поворота.

Примерно как здесь (http://www.prog.org.ru/index.php?topic=18002.msg121509#msg121509)


Название: Re: Повернуть QLabel относительно центра
Отправлено: Globulus от Август 10, 2011, 13:49
Спасибо всем за обстоятельные конструктивные ответы!
Проблема решена!