Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рисование с помощью QPainter в QPixmap, рисование с помощью QPainter в QPixmap  
:(
    Опции темы
olegkuzn
Дата 15.11.2013, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Вот код программы :
Код

#include "ImgLabel.h"
#include <QMouseEvent>
#include <QPainter>

// ImgLabel - класс производный от QLabel
void ImgLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->buttons() | Qt::LeftButton)
    {
        QPixmap* pixDraw = (QPixmap*)pixmap();            // pixDraw - картинка из QLabel
        if(pixDraw == 0)return;

        m_ppaintDraw = new QPainter(pixDraw);             // создаем контекст устройства
        m_ppixmapTmp = new QPixmap(m_rectDraw.size());    // создаем объект QPixmap для сохранения "закрашеной" области

        m_rectDraw.moveCenter(ev->pos());                 // перемещаем прямоугольник в центр мыши

        *m_ppixmapTmp = pixDraw->copy(m_rectDraw);        // запоминаем выбранную область
        m_ppaintDraw->fillRect(m_rectDraw,                // ставит "белую пелену" в  область прямоугольника
                               QColor(255,255,255,128));
        update(m_rectDraw);                               // перерисовываем элемент
    }
}

void ImgLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->buttons() | Qt::LeftButton)
    {
        if(m_ppaintDraw == 0) return;

        m_ppaintDraw->drawPixmap( m_rectDraw, *m_ppixmapTmp);           // восстанавливаем сохраненную картинку
        update(m_rectDraw);                                             // обновляем экран

        m_rectDraw.moveCenter(ev->pos());                                            // перемещаемся на новое место

        *m_ppixmapTmp = pixmap()->copy(m_rectDraw);                     // запоминаем картину

        m_ppaintDraw->fillRect(m_rectDraw, QColor(255,255,255,128));    // создаем "белую пелену"

        update(m_rectDraw);                                             // перерисовываем картинку
    }
}

void ImgLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->buttons() | Qt::LeftButton)
    {
        if(m_ppaintDraw)
        {
            m_ppaintDraw->drawPixmap( m_rectDraw, *m_ppixmapTmp);       // восстанавливаем сохраненную картинку
            update(m_rectDraw);

            delete m_ppixmapTmp;                                        // удаляем объект QPixmap
            m_ppixmapTmp = 0;

            delete m_ppaintDraw;                                        // удаляем контекст устройства
            m_ppaintDraw = 0;
        }
    }
}



Код делает то что нужно - При нажатии левой кнопки мыши появляется прямоугольник из "белой пелены" и
перемещается по экрану вслед за мышью. Однако при движении мыши справа налево остается шлейф из вертикальных линий "белой пелены". Это глюк Qt или я что-то сделал не так.

PM MAIL   Вверх
vinter
Дата 15.11.2013, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Вообще говоря, такие вещи делаются под другому. В мышиных функциях запоминаются координаты, а потом вызывается update(). И всё рисование идёт в paintEvent(), в котором запомненные координаты превращаются в тот рисунок, который необходим. Размазывать рисование по обработчикам мыши не лучший выбор. 


--------------------
Мой блог
PM MAIL WWW   Вверх
olegkuzn
Дата 15.11.2013, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



m_ppaintDraw используется для объекта QPixmap а не для текущего виджета. update() перерисует всю картинку, а желательно перерисовать только измененную часть картинки.
PM MAIL   Вверх
vinter
Дата 15.11.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Для части картинки есть update(const QRect & rect). Так или иначе, тебе нужно стирать старый Pixmap и рисовать новый. Проще всего это делается полной перерисовкой.


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.