определение размеров виджета при использовании QPicture |
Здравствуйте, гость ( Вход | Регистрация )
определение размеров виджета при использовании QPicture |
Litkevich Yuriy |
26.12.2009, 1:00
Сообщение
#1
|
||
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Пытаюсь рисовать на виджете с использованием QPicture.
здесь pic - указатель на QPicture.QPicture я загружаю из файла. На основе QPicture::boundingRect().size(), загруженного рисунка, изменяю размер виджета. Однако рисунок рисовался с отступом от краёв исходного виджета (рисовальщика) по этому получаю такое: Вопрос: Как определить отступ сверху и слева от края виджета, до рисунка. Была мысль спросить у рисовальщика (QPainter'а) минимальную координату, где он побывал, но такого метода я не нашёл. На всякий случай проект прикрепил: PictureViewer.zip ( 3,89 килобайт ) Кол-во скачиваний: 176 Файлы: painter1.log painter2.log тестовые, для загрузки. |
||
|
|||
Kagami |
26.12.2009, 9:27
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Юра, ты меня удивляешь. Есть же функции QWIdget::map*().
Так как у тебя рисовальщик лежит в компоновке и он становится его родительским виджетом, то самый простой способ - вызвать у рисовальщика mapToParent(QPoint(0,0)) - не подходит. Вариантов есть два. Либо хранить в рисовальщике указатель на объект Window и использовать mapTo(window, QPoint(0,0)), либо перебирать родительские виджеты в цикле, пока не дойдем до последнего: а затем mapTo(topParent, QPoint(0,0)).
Сообщение отредактировал Kagami - 26.12.2009, 9:33 |
|
|
Litkevich Yuriy |
26.12.2009, 12:49
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Kagami, не понял.
Я рисую с координат (0, 0) самого виджета. В итоге мне нужно установить виджету размер, такой, чтобы весь рисунок помещался. |
|
|
Kagami |
26.12.2009, 14:00
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Ты про компоновку забываешь - window -> mainLayout -> viewer. А ведь у нее свои поля есть. Поэтому нулевая точка рисовальщика на viewer'е будет смещена относительно (0,0) виджета window.
|
|
|
Litkevich Yuriy |
26.12.2009, 15:01
Сообщение
#5
|
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Меня не интерисует виджет window.
При изменении размеров окна я вижу ту куртинку, какую создавал (сохранил в файле). Я умышленно покрасил фон виджета PictureViewer, чтобы видеть его размеры. Как определить отступ сверху и слева от края виджета, до рисунка. речь идёт о PictureViewer, на котором я рисую. под рисунком я понимаю QPicture, который рисуется рисовальщиком (QPainter).Я рисую по координатам (0, 0): , чтобы воспроизвести рисунок, так, как он был в оригинале.При рисовании компоновщики не играют ни какой роли, равно как и наличие родительского виджета. PictureViewer может быть единственным виджетом (окном верхнего уровня) Вот этот размер меня интерисует: |
|
|
||
Kagami |
26.12.2009, 19:26
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Юр, что бы до конца прояснить ситуацию, при создании этих рисунков, они рисовались с точки (0, 0) или со смещением, которое ты и хочешь выяснить?
|
|
|
Litkevich Yuriy |
26.12.2009, 20:03
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
они рисовались с точки (0, 0 рисовались так:
Это переделанный пример из книги Шлее. как я понимаю, координаты именно (0, 0) |
|
|
Kagami |
26.12.2009, 21:30
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Чуть-чуть покопался в исходниках QPicture. Заметил что boundRect зашивается в файл при сохранении. Надо посмотреть как они его считают, может какая идея и придет.
UPD. Все оказалось гораздо проще. В файле, куда сохранен QPicture, зашит левый верхний угол ограничивающего прямоугольника и его высота и ширина. Как их считать написано в /opt/qtsdk-2009.05/qt/src/gui/image/qpicture.cpp, смотри функцию QPicturePrivate::checkFormat() UPD2. Совсем забыл - ответ на твой первоначальный вопрос: Цитата int top = pic->boundingRect().y();
int left = pic->boundingRect().x(); Сообщение отредактировал Kagami - 26.12.2009, 22:21 |
|
|
Litkevich Yuriy |
26.12.2009, 23:04
Сообщение
#9
|
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Надо посмотреть как они его считают я его чуть ли не наизусть выучилВ файле, куда сохранен QPicture, зашит левый верхний угол ограничивающего прямоугольника блин, как-то я то из виду упустил, что у прямоугольника начальная координата может быть не нулевой.Kagami, спасибо большое!, почти сутки Нынешний фрагмент кода от моего первоначального исходника:
Вот как теперь: |
|
|
||
Kagami |
26.12.2009, 23:16
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Кстати, а почему бы тебе не выводить рисунок со смещением?
Цитата int top = pic->boundingRect().y();
int left = pic->boundingRect().x(); painter.drawPicture(QPoint(-left, -top), *pic); |
|
|
Текстовая версия | Сейчас: 27.12.2024, 15:33 |