Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Qimage/Qpixmap paste (вставить)

Автор: Warm0ngeR 17.7.2010, 10:06

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

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

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

Собственно, как вставить скопированное? Копировал qimage: QImage QImage::copy ( const QRect & r = QRect() ).

Автор: Алексей1153 17.7.2010, 10:17

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

Автор: Warm0ngeR 17.7.2010, 11:09

Это не то, там как бы функция 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

попробуй
QImage::drawImage

Автор: Warm0ngeR 15.11.2010, 17:40

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

Раскрывающийся текст

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, который помогает в "свистелке-пер**лке"(читать выше)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)