crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Получить изображение рабочего стола
Danmerpro
  опции профиля:
сообщение 28.4.2012, 11:40
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


Добрый день. Нужно реализовать рисование мышкой на рабочем столе. Первая мысль - получать изображение рабочего стола как картинку, а поверх неё уже и рисовать. Тут возникла загвоздка - как получить данные о пикселях, что за пределами виджета?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 28.4.2012, 12:15
Сообщение #2


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

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

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




Репутация:   34  


это не кроссплатформенная задача, насколько я понимаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 28.4.2012, 12:23
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


Цитата(Алексей1153 @ 28.4.2012, 13:15) *
это не кроссплатформенная задача, насколько я понимаю

Почему? Работать должно везде, если вы об этом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 28.4.2012, 14:00
Сообщение #4





Гости








    


Посмотри пример Desktop/Screenshot
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 28.4.2012, 14:15
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


Возникла следующая проблема - как развернуть виджет на всю область экрана? Как убрать рамки я нашел. А вот как сделать так, чтобы весь taskbar с меню "пуск" был скрыт рабочей областью виджета?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 28.4.2012, 15:20
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


С этим тоже разобрался. showFullScreen() что-то сразу не приметил.
На данный момент функция рисования такова:
void DrawingScene::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,desktop);
    painter.setPen(Qt::red);
    QList<QList<QPoint> >::const_iterator itb = mDrawBuffer.begin();
    while(itb != mDrawBuffer.end())
    {
        if((*itb).size() < 2) return;
        QList<QPoint>::const_iterator it = (*itb).begin();
        QPoint start = *it;
        it++;
        while(it != (*itb).end()) {
            QPoint end = *it;
            painter.drawLine(start,end);
            start = end;
            it++;
        }
        itb++;
    }
}

где desctop - это Pixmap, которая получается с помощью операции
desktop = QPixmap::grabWindow(QApplication::desktop() -> winId());

Из-за того, что в функции отрисовки постоянно вызывается
painter.drawPixmap(0,0,desktop);

программа тормозит и не получается плавно рисовать. Но если такую функцию не использовать, а заранее попытаться отрисовать, то всё равно вызов paintEvent перерисует все окно и то, что было в desktop не отобразится. Как быть? Возможно ли задать для виджета фиксированный фон, который потом лишь изредка менять?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 28.4.2012, 18:38
Сообщение #7


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

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

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




Репутация:   34  


можно создать QBitmap (или QImage) в памяти - как член класса виджета , туда один раз скопировать фон. Все действия по рисованию вносить туда. А в paintEvent лишь выводить весь объект на морду виджета. Наверное, придётся ещё таймер на 50...100 мс прилепить - для обновления "на всякий случай"

Сообщение отредактировал Алексей1153 - 28.4.2012, 18:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 30.4.2012, 9:45
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


Цитата(Алексей1153 @ 28.4.2012, 19:38) *
можно создать QBitmap (или QImage) в памяти

Я немного не понял, чем это будет быстрее того, что есть сейчас. Ведь на данный момент моя последовательность действий не особо отличается, за исключением того, что я рисую не QBitmap или QImage, а QPixmap. Меня интересует, как бы не начинать рисование с нуля при наступлении очередного paintEvent, а продолжать его на том месте, где закончил в прошлый раз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 30.4.2012, 13:14
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 16
Регистрация: 21.8.2011
Пользователь №: 2823

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




Репутация:   0  


Сделал вот как -
setAttribute(Qt::WA_OpaquePaintEvent);

Таким образом виджет не закрашивает свой фон при очередном наступлении QPaintEvent, и я могу дорисовать только то, что нужно в данный момент.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 3.12.2024, 13:09