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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsItem и физические размеры (дюймы, миллиметры)  (Прочитано 3503 раз)
marbius
Гость
« : Ноябрь 13, 2010, 16:52 »

Доброго времени суток.

Как можно сделать, чтобы для наследника от QGraphicsItem можно было задавать габариты в физических величинах, миллиметрах, дюймах и пр.?

Немного запутался: собственно физические размеры можно получить, используя QPaintDevice::logicalDpiX() и ::logicalDpiY(), но как тогда в конструкторе "получить" QPaintDevice? Как бы, можно сделать расчеты и в QGraphicsItem::paint(...), но тогда "пролетает" QGraphicsItem::boundingRect().

Благодарен.
Записан
marbius
Гость
« Ответ #1 : Ноябрь 13, 2010, 17:50 »

Если кому интересно, реализовал так:

Код
C++ (Qt)
MyItem::MyItem(QGraphicsItem *parent) :
   QGraphicsItem(parent)
{
   dpiX=0;
   dpiY=0;
   width=100;
   height=100;
}
 
QRectF MyItem::boundingRect() const
{
   return QRectF (0,0,width+2,height+2);
}
 
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{   QPaintDevice *device=painter->paintEngine()->paintDevice();
   int dX=device->logicalDpiX();
   int dY=device->logicalDpiY();
   if ((dpiX!=dX)||(dpiY!=dY))
   {
       dpiX=dX;
       dpiY=dY;
       width=int(sizeX*dX/25.4);               // sizeX и sizeY - размеры в миллиметрах
       height=int(sizeY*dY/25.4);
       this->prepareGeometryChange();      // невнимательно читал Assistant, упустил из виду, потому утверждения про "пролетающий" boundingRect не верны
   }
   painter->drawRect(0,0,width,height);
}
 

Код работает как задумывалось: появилась возможность задавать размеры в миллиметрах. Прошу меня поправить, если такой подход не верен.
Спасибо.
Записан
pethead
Гость
« Ответ #2 : Ноябрь 13, 2010, 18:12 »

прям в мм? а если 2 монитора с одинаковым разрешением но разной диагональю, т.е. физическая точка разная, этот движок что отрисует все равно одинаковые квадратики?
Записан
marbius
Гость
« Ответ #3 : Ноябрь 13, 2010, 18:37 »

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

А "этот движок" - это Вы про что?
Записан
pethead
Гость
« Ответ #4 : Ноябрь 13, 2010, 20:34 »

p a i n t E n g i n e
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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