crossplatform.ru

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

> grabWidget скрытого виджета, некорректно грабится
mezmay
  опции профиля:
сообщение 28.2.2011, 12:17
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Есть виджет (QWebView) , в него загружена картинка. Делаю этому виджету hide() (он в лейауте, если это важно), а потом QPixmap::grabWidget(). В результате pixmap содержит только половину положенного изображения - вторая половина серая. Почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
kwisp
  опции профиля:
сообщение 28.2.2011, 12:40
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(mezmay @ 28.2.2011, 12:17) *
Делаю этому виджету hide() (он в лейауте, если это важно)

ну тут у него меняется размер. возможно картинка не влезает полностью.
поэкспериментируй. меняй размер виджета QWebView и сохраняй на диск результат grabWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 28.2.2011, 13:23
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


проверял, при hide()'e resizeEvent() не вызывается.
Уточню - не просто половина серая, а виджет как бы смещается на половину своей высоты вверх...

Сообщение отредактировал mezmay - 28.2.2011, 13:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 28.2.2011, 15:57
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(mezmay @ 28.2.2011, 13:23) *
Уточню - не просто половина серая, а виджет как бы смещается на половину своей высоты вверх...

код показывай. скриншоты. так будет легче разобраться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 28.2.2011, 17:04
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


В 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);
}


прилагаются файлы:
1.jpg, 2.jpg - пример некорректного сохранения
3.jpg - как должно было бы сохраняться
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 28.2.2011, 17:25
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(mezmay @ 28.2.2011, 17:04) *
В CMapWidget лейаут, в нем поочередно отображаются или класс Google карты или класс Yandex карты.
(Одному делается hide(), другому - show()):


этот функционал уже есть в QStackedWidget(Layout)
и зачем ты указываешь QRect ?
без него пробовал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 28.2.2011, 17:46
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Без QRect то же самое
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 28.2.2011, 19:34
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(mezmay @ 28.2.2011, 13:23) *
проверял, при hide()'e resizeEvent() не вызывается.

Он и не должен вызываться.

1. Зачем делать hide для того чтобы потом сграбить? Или, если есть такая необходимость, пробовал ли грабить _не_ делая hide?
2. m_maps[!m_bMap]->rect() - какие тут координаты? Выводи в qDebug, потом делай скриншот сам через внешнюю прогу, проверяй те ли координаты берутся (только ничего не смещай при этом).
3. Попробуй делать декомпозицию: написать тествый пример с минимум всего, что нужно для загрузки карты и дальнейшего grab-а. Возможно даже вообще без карт. А просто самый обычный рисунок грузи. Да хотя и рисунок не нужен. QWebView + любой сайт + hide + grabWidget. Таких чудес в принципе не бывает.
4. Скриншоты чтобы (возможно) понять нужны полностью всего содержимого окна программы в случае когда сам грабиш, и в случае когда это делает printscreen. Иначе вообще непонятно что куда и на сколько смещено.

Сообщение отредактировал Rocky - 28.2.2011, 19:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 1.3.2011, 14:18
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Написал простой тестовый пример:

Раскрывающийся текст
файл cwin.h
#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


файл cwin.cpp
#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();
}


файл cmyweb.h
#ifndef CMYWEB_H
#define CMYWEB_H

#include <QWebView>

class CMyWeb : public QWebView
{
    Q_OBJECT

public:
    CMyWeb(QWidget *parent);
    ~CMyWeb();

private:

};

#endif // CMYWEB_H


файл cmyweb.cpp
#include "cmyweb.h"

CMyWeb::CMyWeb(QWidget *parent)
    : QWebView(parent)
{
    load(QUrl("http://www.mail.ru"));
}

CMyWeb::~CMyWeb()
{

}


В этот раз сохранение с hide()'ом и без hide()'a дало одинаковый результат, причем непонятный.
Смотрите два приложенных файла, первый - то что реально отображается, второй - то что грабится. Грабится почему-то больше)...

Здесь почему-то получилось безо всяких смещений, но сохраняемое изображение все равно не соответствует отображаемому
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 1.3.2011, 14:24
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


дык у тебя скролингов нет, реальная картинка - та, что сграбилась
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 18:28