crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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();
}


Вот как теперь:
Прикрепленное изображение
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 может быть единственным виджетом (окном верхнего уровня)

Вот этот размер меня интерисует:
Прикрепленное изображение
Kagami Дата 26.12.2009, 14:00
  Ты про компоновку забываешь - window -> mainLayout -> viewer. А ведь у нее свои поля есть. Поэтому нулевая точка рисовальщика на viewer'е будет смещена относительно (0,0) виджета window.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 1:27