crossplatform.ru

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


  Ответ в определение размеров виджета при использовании QPicture
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 27.12.2009, 1:45
  Подумать конечно можно, если смещать ровно на отступ. Но пока не знаю, стоит ли так делать.
Kagami Дата 26.12.2009, 23:49
  У меня вроде нормально. По сравнению с перыми вариантом я только добавил смещение для вывода. Минимальный размер оставил равным boundingRect()
Litkevich Yuriy Дата 26.12.2009, 23:20
 
Цитата(Kagami @ 27.12.2009, 2:16) *
Кстати, а почему бы тебе не выводить рисунок со смещением?
а потому-что другой рисунок обрежется, проверь на painter2.log
Kagami Дата 26.12.2009, 23:16
  Кстати, а почему бы тебе не выводить рисунок со смещением?
Цитата
int top = pic->boundingRect().y();
int left = pic->boundingRect().x();
painter.drawPicture(QPoint(-left, -top), *pic);
Litkevich Yuriy Дата 26.12.2009, 23:04
 
Цитата(Kagami @ 27.12.2009, 0:30) *
Надо посмотреть как они его считают
я его чуть ли не наизусть выучил

Цитата(Kagami @ 27.12.2009, 0:30) *
В файле, куда сохранен QPicture, зашит левый верхний угол ограничивающего прямоугольника
блин, как-то я то из виду упустил, что у прямоугольника начальная координата может быть не нулевой.

Kagami, спасибо большое!, почти сутки трахмучаюсь


Нынешний фрагмент кода от моего первоначального исходника:
PictureViewer::PictureViewer(const QPicture &picture, QWidget *pwgt) : QWidget(pwgt)
{
    *pic = picture;
    minSize = pic->boundingRect().size();
    
    int top = pic->boundingRect().y();
    int left = pic->boundingRect().x();
    qDebug() << "X =" << left << " | " << "Y =" << top;
    minSize += QSize(left, top);
}

void PictureViewer::refrash()
{
    minSize = pic->boundingRect().size();
    qDebug() << "PictureViewer::refrash...........minSize =" << minSize << "    size() =" << size();
    int top = pic->boundingRect().y();
    int left = pic->boundingRect().x();
    qDebug() << "X =" << left << " | " << "Y =" << top;
    minSize += QSize(left, top);    
        
    //resize(minSize);
    update();
    updateGeometry();
}


Вот как теперь:
 Р˜Р·РѕР±СЂР°Р¶РµРЅРёРµ уменьшено
Прикрепленное изображение
183 x 232 (3.6 килобайт)
Kagami Дата 26.12.2009, 21:30
  Чуть-чуть покопался в исходниках 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();
Litkevich Yuriy Дата 26.12.2009, 20:03
 
Цитата(Kagami @ 26.12.2009, 22:26) *
они рисовались с точки (0, 0
рисовались так:
    virtual void paintEvent(QPaintEvent*)
    {
        QPicture    pic;
        QPainterPath path;
        QPointF      pt1(width(), height() / 2);
        QPointF      pt2(width() / 2, -height());
        QPointF      pt3(width() / 2, 2 * height());
        QPointF      pt4(0, height() / 2);
        path.moveTo(pt1);
        path.cubicTo(pt2, pt3, pt4);/**/

        QRect rect(width() / 4, height() / 4, width() / 2, height() / 2);
        path.addRect(rect);
        path.addEllipse(rect);

        QPainter painter;
        qDebug() << "---------- record ------------";
        painter.begin(&pic);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.setPen(QPen(Qt::blue, 6));
        painter.drawPath(path);
        painter.end();
        if (!pic.save("./painter.log")){
            qDebug() << "anable to save log-file";
        }
        
        qDebug() << "---------- play ------------";
        painter.begin(this);
        painter.drawPicture(QPoint(0, 0), pic);
        painter.end();
        
    }


Это переделанный пример из книги Шлее.

как я понимаю, координаты именно (0, 0)
Kagami Дата 26.12.2009, 19:26
  Юр, что бы до конца прояснить ситуацию, при создании этих рисунков, они рисовались с точки (0, 0) или со смещением, которое ты и хочешь выяснить?
Litkevich Yuriy Дата 26.12.2009, 15:01
  Меня не интерисует виджет window.
При изменении размеров окна я вижу ту куртинку, какую создавал (сохранил в файле).
Я умышленно покрасил фон виджета PictureViewer, чтобы видеть его размеры.
Цитата(Litkevich Yuriy @ 26.12.2009, 4:00) *
Как определить отступ сверху и слева от края виджета, до рисунка.
речь идёт о PictureViewer, на котором я рисую. под рисунком я понимаю QPicture, который рисуется рисовальщиком (QPainter).
Я рисую по координатам (0, 0):
painter.drawPicture(QPoint(0, 0), *pic);
, чтобы воспроизвести рисунок, так, как он был в оригинале.

При рисовании компоновщики не играют ни какой роли, равно как и наличие родительского виджета. PictureViewer может быть единственным виджетом (окном верхнего уровня)

Вот этот размер меня интерисует:
 Р˜Р·РѕР±СЂР°Р¶РµРЅРёРµ уменьшено
Прикрепленное изображение
136 x 185 (2.05 килобайт)
Kagami Дата 26.12.2009, 14:00
  Ты про компоновку забываешь - window -> mainLayout -> viewer. А ведь у нее свои поля есть. Поэтому нулевая точка рисовальщика на viewer'е будет смещена относительно (0,0) виджета window.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 1:05