Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получить изображение рабочего стола
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
Danmerpro
Добрый день. Нужно реализовать рисование мышкой на рабочем столе. Первая мысль - получать изображение рабочего стола как картинку, а поверх неё уже и рисовать. Тут возникла загвоздка - как получить данные о пикселях, что за пределами виджета?
Алексей1153
это не кроссплатформенная задача, насколько я понимаю
Danmerpro
Цитата(Алексей1153 @ 28.4.2012, 13:15) *
это не кроссплатформенная задача, насколько я понимаю

Почему? Работать должно везде, если вы об этом.
Гость
Посмотри пример Desktop/Screenshot
Danmerpro
Возникла следующая проблема - как развернуть виджет на всю область экрана? Как убрать рамки я нашел. А вот как сделать так, чтобы весь taskbar с меню "пуск" был скрыт рабочей областью виджета?
Danmerpro
С этим тоже разобрался. 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
можно создать QBitmap (или QImage) в памяти - как член класса виджета , туда один раз скопировать фон. Все действия по рисованию вносить туда. А в paintEvent лишь выводить весь объект на морду виджета. Наверное, придётся ещё таймер на 50...100 мс прилепить - для обновления "на всякий случай"
Danmerpro
Цитата(Алексей1153 @ 28.4.2012, 19:38) *
можно создать QBitmap (или QImage) в памяти

Я немного не понял, чем это будет быстрее того, что есть сейчас. Ведь на данный момент моя последовательность действий не особо отличается, за исключением того, что я рисую не QBitmap или QImage, а QPixmap. Меня интересует, как бы не начинать рисование с нуля при наступлении очередного paintEvent, а продолжать его на том месте, где закончил в прошлый раз.
Danmerpro
Сделал вот как -
setAttribute(Qt::WA_OpaquePaintEvent);

Таким образом виджет не закрашивает свой фон при очередном наступлении QPaintEvent, и я могу дорисовать только то, что нужно в данный момент.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.