crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Некорректная отрисовка прямоугольника и линии
anater
  опции профиля:
сообщение 13.10.2010, 21:08
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 25.12.2009
Пользователь №: 1335

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток.
Совершенно идиотская ситуация.

Определяю координаты элементов на QFrame
QLineF line(this->pb_graf->pos().x(),this->pb_graf->pos().y(),this->pb_graf->width(),this->pb_graf->height());
QRect rect(this->pb_graf->pos().x()+1,this->pb_graf->pos().y()+1,this->pb_graf->pos().x()+this->pb_graf->width()-5,this->pb_graf->height()-3);


и хочу их отрисовать.

        QPainter qppb (this);

std::cout <<"X " <<this->pb_graf->geometry().x() << std::endl;
std::cout <<"Y  " <<this->pb_graf->geometry().y() << std::endl;
std::cout <<"W  " <<this->pb_graf->geometry().width() << std::endl;
std::cout <<"H  " <<this->pb_graf->geometry().height() << std::endl;

    qppb.setPen(QPen(Qt::red));
qppb.drawRect(rect);    
qppb.drawLine(line);


Так прямоугольник рисуется идиально аккуратно по краям QFrame.

ЛИНИЯ!!!! по тем же координатам рисуется соответственно по диагонали но доходит примерно до середины прямоугольника. До противоположного края просто не дотягивается(!).
Уже всю голову сломал...

Помогите решить этот глюк.
Причина редактирования: пользуйтесь тагом code вместо codebox
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2010, 21:33
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а вот так должна быть вся главная диагональ. Получается ?
    QRect rect
    (
         pb_graf->pos().x()+1
        ,pb_graf->pos().y()+1
        ,pb_graf->pos().x()+pb_graf->width()-5
        ,pb_graf->height()-3
    );
    
    QLineF line
    (
         rect.topLeft()
        ,rect.bottomRight()
    );


    QPainter P(this);
    P.drawRect(rect);
    P.drawLine(line);


Сообщение отредактировал Алексей1153 - 13.10.2010, 21:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
anater
  опции профиля:
сообщение 13.10.2010, 21:39
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 25.12.2009
Пользователь №: 1335

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да получилось!

А почему именно так. Дело в том что мне очень нужно работать непосредственно с координатами. Непростой рисуночек формируется. Да и потом тоже нужно будет юзать по координатам.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2010, 21:42
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


любой рисунок можно разбить на подрисунки. А в данном случае я использовал уже вычисленные координаты (углы прямоугольника) для дальнейших расчётов (линия).

зря только QLineF - зачем тебе float при отрисовке графики ? Скорось так себе будет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
anater
  опции профиля:
сообщение 13.10.2010, 21:44
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 25.12.2009
Пользователь №: 1335

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 13.10.2010, 22:41) *
любой рисунок можно разбить на подрисунки. А в данном случае я использовал уже вычисленные координаты (углы прямоугольника) для дальнейших расчётов (линия).

Да что ты сделал я понял.

Мучает вопрос почему не отрисовывется по человечески на основе одних и тех же координат? есть предположения?
И есть ли способ корректно отрисовывать на основе координат?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2010, 21:51
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(anater @ 14.10.2010, 0:44) *
Мучает вопрос почему не отрисовывется по человечески на основе одних и тех же координат? есть предположения?


если твой код отформатировать по-человечьи, то становится очевидно, что координаты нифига не одни и те же :)
QLineF line(
        pb_graf->pos().x(), //0
        pb_graf->pos().y(), //0
        pb_graf->width(),  //10
        pb_graf->height()  //20
        );

QRect rect(
        pb_graf->pos().x()+1,   //0+1 ==1
        pb_graf->pos().y()+1,   //0+1 ==1
        pb_graf->pos().x()+pb_graf->width()-5,   //0+10-5 ==5
        pb_graf->height()-3   //20-3 ==17
        );


Сообщение отредактировал Алексей1153 - 13.10.2010, 21:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
anater
  опции профиля:
сообщение 13.10.2010, 21:57
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 25.12.2009
Пользователь №: 1335

Спасибо сказали: 0 раз(а)




Репутация:   0  


Запустил у себя в софтине:

вывод this->pb_graf->height() = 162
rect.bottomRight().y() = 230

по ширине идентично
а вот по высоте!!!
ведь линия и прямоугольник строились на основании this->pb_graf->height()
перестаю понимать.

Просто перепробывал уже все варианты и начал кидаться в крайности... отсюда кривизна кода...

Сообщение отредактировал igor_bogomolov - 14.10.2010, 7:32
Причина редактирования: не цитируй целыми сообщениями
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2010, 22:02
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


anater, обрати внимание, что для линии в конструкторе указываются координаты двух точек, а для прямоугольника - точка и размеры

QLineF ( qreal x1, qreal y1, qreal x2, qreal y2 )
QRect ( int x, int y, int width, int height )

Сообщение отредактировал Алексей1153 - 13.10.2010, 22:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
anater
  опции профиля:
сообщение 13.10.2010, 22:06
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 25.12.2009
Пользователь №: 1335

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 13.10.2010, 23:02) *
anater, обрати внимание, что для нинии в конструкторе указываются координаты двух точек, а для прямоугольника - точка и размеры

QLineF ( qreal x1, qreal y1, qreal x2, qreal y2 )
QRect ( int x, int y, int width, int height )


Да действительно. Видимо придется смириться. :blink:

В принципе проблема решена. Но можно еще позанудствую?

Ведь по идее мой изначальный способ должен был работать?

И для линии и для прямоугольника это должно было бы работать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.10.2010, 22:10
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


кстати, если ты в справку заглядывал, то там есть конструкторы

QLineF ( const QPointF & p1, const QPointF & p2 )
QRect ( const QPoint & topLeft, const QPoint & bottomRight )

- как тебе и хотелось :)

Цитата(anater @ 14.10.2010, 1:06) *
Ведь по идее мой изначальный способ должен был работать?

И для линии и для прямоугольника это должно было бы работать?

что за способ, и что "это" ? Непонимяу

Сообщение отредактировал Алексей1153 - 13.10.2010, 22:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 8:06