Russian Qt Forum
Ноябрь 25, 2024, 08:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нарисовать отрезок  (Прочитано 6191 раз)
Илья с поч.ящиком garner
Гость
« : Май 02, 2006, 16:38 »

// QWidget * this;

1       QPainter p(this);
2       ..........
3       p.drawLine(P1, P2);


После 3-го дейстия хотелось бы вернуться к шагу 2 без предварительного QPixmap::grabWidget (QWidget * widget, const QRect & rectangle), например. Если отрезок диагональный, то это перерисовывка всего экрана.

Может есть варианты проще?
Записан
Sergeich
Гость
« Ответ #1 : Май 02, 2006, 23:54 »

Корректно надо задачу ставить, молодой человек.
P.S.
  Кондуктор с пиздой
Записан
Илья с поч.ящиком garner
Гость
« Ответ #2 : Май 03, 2006, 08:43 »

Согласен, что формулировать вопрос надо корректно. После длительной работы с простой задачкой, она кажется тривиальной с точки зрения формулировки, что необязательно для другого. Так что пробую еще раз, если что непонятно задавайте вопрос по существу.
На объекте QWidget рисуется множество отрезков, полигонов и других замечательных фигур, например. Это рисование назовем событием №2.
Теперь необходимо на этом объекте нарисовать отрезок и потаскать одну из его сторон (P2) за курсором с фиксированным началом (P1). Т.е. следующим шагом я рисую, например, Красный отрезок сантиметров так в 20, пикселов так в 10, о прекрасный кондуктор. Появление данного отрезка - это событие №3. Теперь я хочу восстановить ситуацию на событие назад. Т.е. удалить отрезок. Насколько знаю - в библиотеке MFC для Windows это делается простой операцией XOR.
В QT4 проще предварительного захвата прямоугольной (с диагональю P1-P2) части QWidget для последующего ее восстановления-перерисовки в QWidget::paintEvent (удаление отрезка) ничего не придумал. А если отрезок во всю диагональ экрана (дарагой кандухтар) частая перерисовка прямоугольника с такой диагональю займет значительное время - типа будет тормозить, морозить всю программу.
Если что забыл пояснить - с удовольствием отвечу на ваши вопросы.
Особенно буду рад "Кондуктору с пиздой", который, надеюсь, продемонстрирует и некоторое понимание QT.
Записан
comrade
Гость
« Ответ #3 : Май 03, 2006, 11:45 »

а какая проблема? рисуй как нравится. хочешь XORить - XORь. у QPainter есть такое слово setRasterOp( RasterOp r ) - вот туда на место r Qt::XorROP надо положить. по умолчанию там Qt::CopyROP записато. посмотри RasterOp в асистанте. там много всякого... это если в Qt3
а в Qt4 есть setCompositionMode( CompositionMode mode ) и
QPainter::CompositionMode_Xor соответственно. хотя область сохранять - тоже можно.
Записан
Sergeich
Гость
« Ответ #4 : Май 03, 2006, 14:01 »

Я в свое время делал так: рисовал всю картинку в пиксмап, потом в paintEvent
выводил нужный кусок пиксмапа на виджет и рисовал быстро изменяющиеся объекты, типа твоего отрезка.
 P.S.
Иностранец с табуреткой
Записан
Илья с поч.ящиком garner
Гость
« Ответ #5 : Май 04, 2006, 08:02 »

В том и дело, Sergeich, что “нужный кусок пиксмапа” у меня иначе как прямоугольник не получается. В QWidget есть repaint(QRegion), но наверно не для этого случая.
Comrade, XORом как раз веселее, но у QPainter::setCompositionMode (CompositionMode mode) есть Warning: You can only set the composition mode for QPainter objects that operates on a QImage.
Подготовить рисунок на Qimage и через девайс рисования QWidget отразить его на мониторе – лучший в смысле скорости отображения вариант. Если нарисовать отрезок сначала на Qimage или на QWidget сразу, то всеравно процедура его удаления, с последующим отображением восстановленного куска, потребует работы с целым прямоугольником (с диагональю P1, P2), а это заметно глазу сказывается на скорости.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 21.