Пытаюсь рисовать на виджете с использованием QPicture.
void PictureViewer::paintEvent(QPaintEvent*)
{
QPainter painter;
if (pic){
painter.begin(this);
painter.drawPicture(QPoint(0, 0), *pic);
painter.end();
}
}
здесь pic - указатель на QPicture.Юра, ты меня удивляешь. Есть же функции QWIdget::map*().
Так как у тебя рисовальщик лежит в компоновке и он становится его родительским виджетом, то самый простой способ - вызвать у рисовальщика mapToParent(QPoint(0,0)) - не подходит. Вариантов есть два. Либо хранить в рисовальщике указатель на объект Window и использовать mapTo(window, QPoint(0,0)), либо перебирать родительские виджеты в цикле, пока не дойдем до последнего:
QWidget* topParent = parentWidget();
while (topParent->parentWidget())
topParent = topParent->parentWidget();
а затем mapTo(topParent, QPoint(0,0)).
Kagami, не понял.
Я рисую с координат (0, 0) самого виджета.
В итоге мне нужно установить виджету размер, такой, чтобы весь рисунок помещался.
Ты про компоновку забываешь - window -> mainLayout -> viewer. А ведь у нее свои поля есть. Поэтому нулевая точка рисовальщика на viewer'е будет смещена относительно (0,0) виджета window.
Меня не интерисует виджет window.
При изменении размеров окна я вижу ту куртинку, какую создавал (сохранил в файле).
Я умышленно покрасил фон виджета PictureViewer, чтобы видеть его размеры.
painter.drawPicture(QPoint(0, 0), *pic);
, чтобы воспроизвести рисунок, так, как он был в оригинале.Юр, что бы до конца прояснить ситуацию, при создании этих рисунков, они рисовались с точки (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();
}
Чуть-чуть покопался в исходниках QPicture. Заметил что boundRect зашивается в файл при сохранении. Надо посмотреть как они его считают, может какая идея и придет.
UPD. Все оказалось гораздо проще. В файле, куда сохранен QPicture, зашит левый верхний угол ограничивающего прямоугольника и его высота и ширина. Как их считать написано в /opt/qtsdk-2009.05/qt/src/gui/image/qpicture.cpp, смотри функцию QPicturePrivate::checkFormat()
UPD2. Совсем забыл - ответ на твой первоначальный вопрос:
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();
}
Кстати, а почему бы тебе не выводить рисунок со смещением?
У меня вроде нормально. По сравнению с перыми вариантом я только добавил смещение для вывода. Минимальный размер оставил равным boundingRect()
Подумать конечно можно, если смещать ровно на отступ. Но пока не знаю, стоит ли так делать.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)