Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
1

Qt, виртуальный скриншот виджета(?)

24.06.2014, 16:39. Показов 2894. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,
Возник следующий вопрос: можно ли виртуально в памяти(без вывода на экран), рассчитать как бы выглядел определенный виджет и получить этот скриншот?
Более подробно: допустим есть виджет отображающий шкалу температур, нужно прикрепить скриншот этой шкалы к картинке с разрешением 1000х1000, а на экране в реальности он имеет размер 80x300, и соответственно при его растягивании до нужной высоты, будет потеря качества и иногда сильно. И если бы он на экране был изначально растянут до высоты 1000, я бы получил скриншот не требующий растяжений и потери качества. Можно ли без отображения на экране, проэмулировать вид виджета с нужным размером и взять эту картинку?
Извините, не придумал дельного название темы, прошу переименовать если нужно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2014, 16:39
Ответы с готовыми решениями:

Как навести мышку на x,y внутри виджета относительно 0,0 виджета (левого верхнего угла виджета)?
Как навести мышку на x,y внутри виджета относительно 0,0 этого виджета (левого верхнего угла...

Как добраться до виджета, который находится внутри другого виджета?
Есть QStackWidget, внутри которого на одной из страниц-виджетов находится QTabWidget....

Вызов одного виджета из другого виджета
добрый день, есть 2 формы, сделанные в дизайнере. По нажатию на кнопку из формы 1 хочу чтобы...

Почему заголовок виджета показывается ниже чем текст виджета
Создал зону виджетов. Создал шорткод. Шорткод вставляю в текстовый виджет. Заголовок виджета...

12
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
24.06.2014, 16:56 2
Лучший ответ Сообщение было отмечено Asting как решение

Решение

Можно попробовать вызывать render виджета задав setScale у QPainter.

То есть что-то типа:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
    QImage image(500,500, QImage::Format_ARGB32);
    image.fill(Qt::white);
    QPainter p(&image);
    p.scale(3,3);
 
    QStyleOptionButton opt;
    opt.state = QStyle::State_Active | QStyle::State_Enabled;
    opt.text = "123";
    opt.rect = QRect(25, 25, 100, 30);
    style()->drawControl(QStyle::CE_PushButton, &opt, &p);
    p.end();
Результат все равно не очень. Хотя текст рисует не размытым, значит другие значения захадходены.
В общем маловероятно.
1
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
24.06.2014, 17:17  [ТС] 3
Цитата Сообщение от RazrFalcon Посмотреть сообщение
задав setScale у QPainter
Весьма неожиданно, оказалось тем что мне нужно! Похоже этот метод обрабатывает область рендера изначально как векторное изображение и в конце загоняет в растр..., текст не размывается, что меня больше всего интересовало.

Добавлено через 8 минут
А вот с изображением беда: цветовая полоска, при растяжении видимо "раздвигаються" пиксели и между ними заполняется белым цветом...становится похоже на очень бледную картинку и легко видны эти пробелы. Пойду копать дальше...
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
24.06.2014, 17:29 4
Покажите скришот, не ясно что случилось.
Вы стандартный виджет рендерите или свой?
0
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
24.06.2014, 17:36  [ТС] 5
Виджет из библиотеки Qwt, результат 5-ти кратного растяжения. Сейчас еще пробую другими способами как то сделать.
Миниатюры
Qt, виртуальный скриншот виджета(?)  
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
24.06.2014, 17:39 6
А должно быть без белых полосок?
Скорее всего сказывается то что шаг рисования полосок в double рассчитывается, а рисуется уже в int - и это вызывает погрешность которой нет при обычном масштабе.
0
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
24.06.2014, 17:44  [ТС] 7
Да конечно, вот оригинал.
Что то очень много для погрешности получается(
Миниатюры
Qt, виртуальный скриншот виджета(?)  
0
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
25.06.2014, 00:55  [ТС] 8
Пробую создать новый виджет, как в коде в начале, но сразу нужного размера и снять с него рендер. Процедура получается, но цифры все же плывут, и это очень странно.

Добавлено через 6 часов 59 минут
Вообщем в итоге пришел к следующему костылю:
Беру рендер виджета, далее масштабирую непосредственно QImage, получаю картинку с приемлемым изображение цветовой шкалы, но смазанным текстом. Далее беру второй рендер но сразу же масштабируя QPainter::scale(...); - получаю отличный текст + ось(но непригодную цветовую шкалу), вырезаю нужный кусок и вставляю в первое изображение.
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.06.2014, 10:10 9
А что если задать бэкграунд виджета через градиент с помощью setStyleSheet() ???
Тогда при изменении размеров виджета все будет гладко и без без искажений.
Примерный вариант градиента:
CSS
1
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 0, 0, 255), stop:0.166 rgba(255, 255, 0, 255), stop:0.333 rgba(0, 255, 0, 255), stop:0.5 rgba(0, 255, 255, 255), stop:0.666 rgba(0, 0, 255, 255), stop:0.833 rgba(255, 0, 255, 255), stop:1 rgba(255, 0, 0, 255));
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
25.06.2014, 10:49 10
Собственно, а почему бы не попробовать в вектор отрисовать?
Создать объект класса QSvgGenerator и передать его в
C++ (Qt)
1
void QWidget::render ( QPaintDevice * target, const QPoint & targetOffset = QPoint(), const QRegion & sourceRegion = QRegion(), RenderFlags renderFlags = RenderFlags( DrawWindowBackground | DrawChildren ) )
1
39 / 39 / 17
Регистрация: 14.10.2013
Сообщений: 174
26.06.2014, 13:33  [ТС] 11
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
почему бы не попробовать в вектор отрисовать?
Была такая идея сразу, быстро отказался не придумав как организовать, т.к. генератор рассчитан на запись сразу в файл(?). Немножко позже еще раз попробую организовать.
Цитата Сообщение от alexey_rage Посмотреть сообщение
с помощью setStyleSheet() ???
хм, никогда таким не занимался но в целях изучения стоит попробовать. Единственное боюсь что градиенты могут где-то не совпадать. Так же только попробую попозже немножко.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
26.06.2014, 13:45 12
Цитата Сообщение от Asting Посмотреть сообщение
генератор рассчитан на запись сразу в файл(?).
Он может писать в QIODevice, у которого есть наследник QBuffer
1
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
26.06.2014, 15:18 13
Цитата Сообщение от Asting Посмотреть сообщение
Единственное боюсь что градиенты могут где-то не совпадать.
Ну так можно всегда подправить значения градиента так, чтобы совпадали.

Добавлено через 28 минут
Вот, наверное что-то похожее на то, что вам нужно:
CSS
1
background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgb(100, 0, 0), stop:0.166 rgba(255, 0, 0, 255), stop:0.333 rgba(255, 255, 0, 255), stop:0.5 rgba(0, 255, 0, 255), stop:0.666 rgba(0, 255, 255, 255), stop:0.833 rgba(0, 0, 255, 255), stop:1 rgba(0, 0, 127, 255));
1
26.06.2014, 15:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2014, 15:18
Помогаю со студенческими работами здесь

Чтение URL адресса из окна виджета и открытие его браузером при нажатии кнопки виджета
#Как считать url со строки ввода в виджете что бы потом при нажатии кнопки виджета открыть этот...

Что такое виртуальный и относительный виртуальный адрес?
Прив. Хочу разобрать одну программку, дизассемблировал ее и начал разбиратся. При помощи API...

Перебиваются стили виджета Nav::widget при подключении виджета \yii\jui\Dialog::widget
Добрый день. Возникла следующяя проблема при подключении виджета \yii\jui\Dialog::widget в yii2 ...

Нужно клонировать виртуальный жесткий диск из RAID 0 на виртуальный жесткий диск в RAID 1 (зеркало)
Здравствуйте, очень надеюсь на вашу помощь. Сижу на работе 2ое суток. Есть intel embedded raid...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru