crossplatform.ru

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


  Ответ в grabWidget скрытого виджета
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 1.3.2011, 17:42
 
Цитата(mezmay @ 1.3.2011, 17:48) *
перешел от системы "hide()-show()" к QStackedWidget
ну если причину понять интересно, то попробуй поковырять исходники QStackedWidget, может быстро найдёшь корень проблемы.
mezmay Дата 1.3.2011, 15:48
  В основной программе тоже заработало корректное сохранение скрытого виджета после того как я перешел от системы "hide()-show()" к QStackedWidget
Rocky Дата 1.3.2011, 15:14
  Выложи архив проекта тогда. Сейчас не создать. Ну или посмотри что выдает web->rect()? Я раньше делал с ->geometry(), проблем не было. Попрбуй поиграться с ректами чисто (->geometry() и т.п. ).
mezmay Дата 1.3.2011, 15:11
  Блин, в этом примере ошибка.
надо вместо
setLayout(vLayout);

было написать
ui.widget->setLayout(vLayout);

После этого заработало корректное сохранение для всех случаев, в том числе и для карты.
Почему оно не работает в моей основной программе - надо разбираться. Пока что думаю что из-за того что у меня в одном лейауте 2 виджета которые по очереди отображаются...
abc Дата 1.3.2011, 14:24
  дык у тебя скролингов нет, реальная картинка - та, что сграбилась
mezmay Дата 1.3.2011, 14:18
  Написал простой тестовый пример:

Раскрывающийся текст
файл 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 дало одинаковый результат, причем непонятный.
Смотрите два приложенных файла, первый - то что реально отображается, второй - то что грабится. Грабится почему-то больше)...

Здесь почему-то получилось безо всяких смещений, но сохраняемое изображение все равно не соответствует отображаемому
Rocky Дата 28.2.2011, 19:34
 
Цитата(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. Иначе вообще непонятно что куда и на сколько смещено.
mezmay Дата 28.2.2011, 17:46
  Без QRect то же самое
kwisp Дата 28.2.2011, 17:25
 
Цитата(mezmay @ 28.2.2011, 17:04) *
В CMapWidget лейаут, в нем поочередно отображаются или класс Google карты или класс Yandex карты.
(Одному делается hide(), другому - show()):


этот функционал уже есть в QStackedWidget(Layout)
и зачем ты указываешь QRect ?
без него пробовал?
mezmay Дата 28.2.2011, 17:04
  В 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 - как должно было бы сохраняться
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 13:32