crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Qimage/Qpixmap paste (вставить)
Warm0ngeR
  опции профиля:
сообщение 17.7.2010, 10:06
Сообщение #1


Новичок


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

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




Репутация:   0  


Доброго времени суток всем!

Вожусь с qimage/qpixmap, рисую на нем всякие фигуры мышкой, заливка и прочее. Дошло до выделения, выделение я сделал. Копирование выделенной области тоже. Но есть проблема с проверкой, как вставить? :rolleyes:

Гугл, маны, документацию спрашивал, знают только для текст (Q3TextEdit QLineEdit QTextEdit).

Собственно, как вставить скопированное? Копировал qimage: QImage QImage::copy ( const QRect & r = QRect() ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 10:17
Сообщение #2


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

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

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




Репутация:   34  


Через поиск по форуму нашёл вот эту тему http://www.forum.crossplatform.ru/index.ph...ic=1906&hl=
По моему, как раз то, что надо

Сообщение отредактировал Алексей1153 - 17.7.2010, 10:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Warm0ngeR
  опции профиля:
сообщение 17.7.2010, 11:09
Сообщение #3


Новичок


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

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




Репутация:   0  


Это не то, там как бы функция open обсуждается.
Которая у меня уже реализована давным давно.

Проблема в использование функции QImage.copy
Цитата
The returned image is copied from the position (x, y) in this image, and will always have the given width and height. In areas beyond this image, pixels are set to 0.

Судя из описания понял, что возвращает копию изображения в точку х.у размером width*height. Но при прописывании он ничего не возвращает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.7.2010, 16:55
Сообщение #4


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

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

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




Репутация:   34  


попробуй
QImage::drawImage
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Warm0ngeR
  опции профиля:
сообщение 15.11.2010, 17:40
Сообщение #5


Новичок


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

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




Репутация:   0  


Реализовал это сам, уже довольно давно, забыл выложить.
Копирование
Раскрывающийся текст

void PaintArea::copyArea()
{
    if (rubberBand)  // если юзверь вообще что-то выделелил
    {
        prretheimage = theImage.copy (rubberBand->pos().x(),rubberBand->pos().y(),rubberBand->size().width(),rubberBand->size().height()); // запиъиваем в спомогательный куимейдж выделенную област
        rubberBand->hide(); // скрываем выделение (ЭФФЕКТ)
    }
    update();   //обновляем холст
}

Копирование выделенной области в prretheimage (запасной холст) theImage - основной. rubberBand - выделение(прямоугольное)


Вставка
Раскрывающийся текст
void PaintArea::pasteArea() // процедура для первого этапа вставки - помещение вспомогательного в начало координат
{
    if ((mytoolsselectwin == 34) or (mytoolsselectwin != 34))  // при =! запускает первый раз, а =34, если несколько раз Ctrl+v жмакаешь
    {
        imageforpastearea = theImage;  // сохраняем первоначальное изображение
        QPainter painter(&theImage);
        painter.drawImage(0,0,prretheimage); // рисуем из 0.0 сохраненное копированием изображение
        mytoolsselectwin=34; // включаем инструмент движения копированной области
        rubberBand->setGeometry(0,0,prretheimage.size().width(),prretheimage.size().height()); // помешаем нарисованное в выделение - ЭФФЕКТ (УЖЕ НЕСЕТ практическую ценность)
        rubberBand->show(); // показываем выделение
    }
    update();   //обновляем холст
}
//--------------------------------------------------------------------------------------------------
void PaintArea::pasteArea(const QPoint &endPoint) // собственно для перемешения по холсту
{

    if (!rubberBand->isHidden()) /*проверяем выделение есть(см начало моус эвентов
          применяется для определения, какую кнопку юзверь нажал, если левую, то все норм,
       иначе перемещение заканчивается       */
    {
        theImage=imageforpastearea; // возвращаем первоначальный холст

        QPoint mypoint((endPoint.x()-pointforpastearea.x()),(endPoint.y()-pointforpastearea.y()));
/*
"свистелка-пер**лка" - если при первок клике по выделению он выбрал относительно выделения координату 0;0
то будет передвигатся по меньшей мере странно
такой подход реализует возможность, что юзверь тыкнул в произвольно место выделения и будет перемещатся
более красиво
*/

        QPainter pa(&theImage);
        pa.drawImage(mypoint,prretheimage); // рисуем в текущее положение мыши копию
        rubberBand->setGeometry(mypoint.x(),mypoint.y(),prretheimage.size().width(),prretheimage.size().height()); // помешаем нарисованное в выделение - ЭФФЕКТ (УЖЕ НЕСЕТ практическую ценность)
    }
    update();   //обновляем холст
}

mytoolsselectwin - это переменная для определения выбранного инструмента




Раскрывающийся текст
              lastPoint = event->pos();
              pointforpastearea.setX(lastPoint.x()-rubberBand->pos().x());
              pointforpastearea.setY(lastPoint.y()-rubberBand->pos().y());

Это в прессэвент(моус эвент), pointforpastearea - qpoint, который помогает в "свистелке-пер**лке"(читать выше)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 15:35