crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
giker
  опции профиля:
сообщение 29.10.2010, 21:39
Сообщение #1


Студент
*

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

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




Репутация:   0  


Добрый день. Помогите пожалуйста. Есть виджет (qwtPlot) который надо отрисовывать в QPixmap используя QGraphicsView. Для отрисовки использую такой код:
QGraphicsScene *scene = new QGraphicsScene(0, 0, qwtPlot->width(), qwtPlot->height());
QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot, Qt::Widget);
QGraphicsView *view = new QGraphicsView();
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view->setScene(scene);
qwtPlot->show();
view->show();
QPixmap pixmap(qwtPlot->size());
if (widget->isVisible())
{
       QPainter painter(&pixmap);
       painter.setRenderHint(QPainter::Antialiasing);
       painter.begin(&pixmap);
       view->render(&painter);
       painter.end();
       if (pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))
       {
            QMessageBox box;
            box.setText("Saved");
            box.exec();
       }
}
delete widget;
delete scene;
delete view;


В результате на диске появляется файл, по виду нужного размера, но абсолютно черный. Что в моем коде неправильно, или здесь проблема в специфике qwt?
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.10.2010, 21:51
Сообщение #2


фрилансер
******

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

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




Репутация:   34  


попробуй убрать
painter.begin(&pixmap);
либо же не указывай в конструкторе адрес девайса (там begin вызовется)

вызов end тоже можно оставить на совесть деструктора:
{
...
       {//ВАЖНО!!! Эти фигурные скобки должны тут быть
              QPainter painter(&pixmap);
              painter.setRenderHint(QPainter::Antialiasing);
              view->render(&painter);
       }//ВАЖНО!!! Эти фигурные скобки должны тут быть
...
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 29.10.2010, 22:31
Сообщение #3


Студент
*

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

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




Репутация:   0  


Ни каких изменений - опять абсолютно черный файл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.10.2010, 22:47
Сообщение #4


фрилансер
******

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

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




Репутация:   34  


хорошо. Делаем чистый эксперимент:
{
...
       {
              QPainter painter(&pixmap);
              painter.fillRect (0,0,10,20,QColor(0,255,0));
       }
...
}


зелёный прямоугольничек есть ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 29.10.2010, 23:14
Сообщение #5


Студент
*

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

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




Репутация:   0  


Есть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.10.2010, 8:53
Сообщение #6


фрилансер
******

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

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




Репутация:   34  


giker, значит что ? По умолчанию девайс залит чёрным цветом. Поэтому не видно, что ты на нём нарисовал чёрными линиями/буквами

Сообщение отредактировал Алексей1153 - 30.10.2010, 8:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 31.10.2010, 8:29
Сообщение #7


Студент
*

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

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




Репутация:   0  


Хорошо, тогда по идее, если сначала залить весь pixmap белым цветом, а потом отрисовать виджет, то мы должны его увидеть:

{
            QPainter painter(&pixmap);
            painter.setRenderHint(QPainter::Antialiasing);
            painter.fillRect (0, 0, qwtPlot->width(), qwtPlot->height(), QColor(Qt::white));
            view->render(&painter);
}


Но в результате имеем только картинку полностью залитую белым цветом.
Но у виджета кроме черных линий есть еще и фон совпадающий с цветом окна, он же дожен отрисоваться?
Значит не правильно отрабатывает view->render(&painter)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.10.2010, 10:43
Сообщение #8


фрилансер
******

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

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




Репутация:   34  


giker, значит, view->render не изменяет картинку, правильно. Почему - я не знаю :) Покажи рисовалку вьюхи
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 31.10.2010, 12:41
Сообщение #9


Студент
*

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

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




Репутация:   0  


В смысле рисовалку? qwtPlot это виджет типа QwtPlot из билиотеки Qwt, существующий и уже отображенный на основной форме приложения, на его месте может быть любой контрол расположенный на форме. Кстати заметил, что если я создаю кнопку в коде (то есть ее нет на форме), то она замечательно отрисовывается в файле:
    QGraphicsScene *scene = new QGraphicsScene();
    //QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot);
    QPushButton * button = new QPushButton("", 0);
    QGraphicsProxyWidget *widget = scene->addWidget(button);
    QGraphicsView *view = new QGraphicsView();
    view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    view->setScene(scene);
    qwtPlot->show();
    QPixmap pixmap(qwtPlot->size());
    if (qwtPlot->isVisible())
    {
        {
            QPainter painter(&pixmap);
            painter.setRenderHint(QPainter::Antialiasing);
            view->render(&painter);
        }
        if (pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))
        {
            QMessageBox box;
            box.setText("Saved");
            box.exec();
        }
    }
    delete widget;
    delete scene;
    delete view;
    delete button;


Это говорит о том, что уже отображенный где-то виджет нельзя отобразить повторно на QGraphicsScene/QGraphicsView?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.10.2010, 12:57
Сообщение #10


фрилансер
******

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

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




Репутация:   34  


giker, я не знаю, с чем это связано. Может быть, размер у вьюхи нулевой ? Попробуй принудительно размер задать какой-нибудь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 1.11.2010, 14:28
Сообщение #11


Студент
*

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

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




Репутация:   0  


Итак после долгих экспериментов, задача почти решилась - фаил заполняет нечто, код вот такой:

QGraphicsScene *scene = new QGraphicsScene(0, 0, qwtPlot->width(), qwtPlot->height());
QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot);
QPixmap pixmap(300, 300);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QGraphicsView *view = new QGraphicsView();
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
qwtPlot->repaint();
view->render(&painter, QRectF(), QRect(), Qt::IgnoreAspectRatio);
pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))


но в файле получается не разлинованая декартова система координат на сером фоне как должно быть, а какие-то сине-фиолетовые полосы. На сколько я понимаю неправильно происходит чтение со сцены в QPixmap. Подскажите пожалуйста в чем дело.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.11.2010, 15:20
Сообщение #12


фрилансер
******

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

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




Репутация:   34  


я так понимаю, что продвижение - это
QPixmap pixmap(300, 300);
? :)

я домой приду, попробую. Это через 3-4 часика
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 3.11.2010, 9:58
Сообщение #13


Студент
*

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

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




Репутация:   0  


Задача так и не решилась - то что я принял за неправильное отображение моего рисунка, оказалось просто мусором при создания pixmap (кстати странно что он не создается просто черным, в каким-то серобурмальновым в полоску). Интересует вот какой вопрос: Возможно ли в принципе отрисовать в файл через QGraphicScene, виджет уже отрисованный на форме или нет?
Решил пойти другим путем: QwtPlot умеет сохранять свои графики в svg формат через QSvgGenerator, мне нужно вставить этот SVG-рисунок в HTML для последующей конвертации его в PDF. В связи с этим возникает вопрос: где хранятся данные svg-картинки в QsvgGenerator. Или нужно сохранить ее файл, а потом вставлять его в HTML? Если да то как: текстом или массивом данных из прочитанного файла?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.11.2010, 10:11
Сообщение #14


фрилансер
******

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

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




Репутация:   34  


блин, я и забыл совсем покопаться, из головы вылетело ((
giker, напомни мне вечером, что ли...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 3.11.2010, 10:15
Сообщение #15


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(giker @ 29.10.2010, 21:39) *
Добрый день. Помогите пожалуйста. Есть виджет (qwtPlot) который надо отрисовывать в QPixmap используя QGraphicsView. Для отрисовки использую такой

А чем просто QPixmap QPixmap::grabWidget ( QWidget * widget, const QRect & rectangle ) [static] вам не подходит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 3.11.2010, 20:42
Сообщение #16


Студент
*

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

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




Репутация:   0  


Не подходит потому что зависит от текущего состояния - размера виджета. Например если пользователь изменит размер родительского окна, соответственно изменяться размеры и дочерних виджетов. Мне же нужно отрисовывать виджет в картинку заданных размеров, желательно с таким же качеством как на экране.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.11.2010, 20:55
Сообщение #17


фрилансер
******

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

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




Репутация:   34  


giker, а ты палитру, кстати, делаешь такую же, как у того, кто рендерит ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 4.11.2010, 14:36
Сообщение #18


Студент
*

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

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




Репутация:   0  


Палитру вообще не выставляю. Где, как и у кого она выставляется?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.11.2010, 15:05
Сообщение #19


фрилансер
******

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

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




Репутация:   34  


хм, а фиг знает. Я нашёл только как прочитать битность и количество цветов - depth() и colorCount ()

кстати, не игнорируй вот это замечание
Цитата(igor_bogomolov @ 3.11.2010, 12:15) *
А чем просто QPixmap QPixmap::grabWidget ( QWidget * widget, const QRect & rectangle ) [static] вам не подходит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 12.6.2025, 20:31