Есть виджет (QWebView) , в него загружена картинка. Делаю этому виджету hide() (он в лейауте, если это важно), а потом QPixmap::grabWidget(). В результате pixmap содержит только половину положенного изображения - вторая половина серая. Почему?
проверял, при hide()'e resizeEvent() не вызывается.
Уточню - не просто половина серая, а виджет как бы смещается на половину своей высоты вверх...
В CMapWidget лейаут, в нем поочередно отображаются или класс Google карты или класс Yandex карты.
(Одному делается hide(), другому - show()):
class CBaseMap : public QWebView
...
class CGoogleMap : public CBaseMap
...
class CYandexMap : public CBaseMap
...
class CMapWidget : public QWidget
{
...
...
private:
bool m_bMap;
CBaseMap* m_maps[2];
QPixmap m_pix;
};
bool __stdcall CMapWidget::create()
{
...
...
QVBoxLayout *vLayout = new QVBoxLayout();
m_maps[Google] = new CGoogleMap(this);
m_maps[Yandex] = new CYandexMap(this);
vLayout->addWidget(m_maps[Google]);
vLayout->addWidget(m_maps[Yandex]);
setLayout(vLayout);
}
QPixmap* __stdcall CMapWidget::currentPixmap()
{
// грабим НЕотображаемую в данный момент карту
m_pix = QPixmap::grabWidget(m_maps[!m_bMap], m_maps[!m_bMap]->rect());
return &m_pix;
}
bool __stdcall CMapWidget::saveCurrentArea( const char* fileName )
{
return currentPixmap()->save(fileName, "JPG", 100);
}
Без QRect то же самое
Написал простой тестовый пример:
#ifndef CWIN_H
#define CWIN_H
#include <QtGui/QMainWindow>
#include "ui_cwin.h"
#include "cmyweb.h"
class cwin : public QMainWindow
{
Q_OBJECT
public:
cwin(QWidget *parent = 0, Qt::WFlags flags = 0);
~cwin();
private:
Ui::cwinClass ui;
CMyWeb *web;
private slots:
void on_pushButtonHide_clicked();
void on_pushButtonSave_clicked();
};
#endif // CWIN_H
#include "cwin.h"
#include <QVBoxLayout>
#include <QPixmap>
cwin::cwin(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QVBoxLayout *vLayout = new QVBoxLayout();
web = new CMyWeb(ui.widget);
vLayout->addWidget(web);
setLayout(vLayout);
}
cwin::~cwin()
{
}
void cwin::on_pushButtonSave_clicked()
{
QPixmap pixmap = QPixmap::grabWidget(web, web->rect());
pixmap.save("1.jpg", "JPG", 100);
}
void cwin::on_pushButtonHide_clicked()
{
web->hide();
}
#ifndef CMYWEB_H
#define CMYWEB_H
#include <QWebView>
class CMyWeb : public QWebView
{
Q_OBJECT
public:
CMyWeb(QWidget *parent);
~CMyWeb();
private:
};
#endif // CMYWEB_H
#include "cmyweb.h"
CMyWeb::CMyWeb(QWidget *parent)
: QWebView(parent)
{
load(QUrl("http://www.mail.ru"));
}
CMyWeb::~CMyWeb()
{
}
дык у тебя скролингов нет, реальная картинка - та, что сграбилась
Блин, в этом примере ошибка.
надо вместо
setLayout(vLayout);
ui.widget->setLayout(vLayout);
Выложи архив проекта тогда. Сейчас не создать. Ну или посмотри что выдает web->rect()? Я раньше делал с ->geometry(), проблем не было. Попрбуй поиграться с ректами чисто (->geometry() и т.п. ).
В основной программе тоже заработало корректное сохранение скрытого виджета после того как я перешел от системы "hide()-show()" к QStackedWidget
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)