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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Быстрое рисование линий инструментом "карандаш"  (Прочитано 13537 раз)
Pritcher
Гость
« Ответ #15 : Январь 22, 2016, 06:28 »

Что ж, вчера был уже вечер, когда я пробовал вызывать update по нужной области, видимо, не заметил прироста скорости. Вызов update непосредственно после отрисовки линии по области помог.
Спасибо, Old, Bepec, Racheengel!

.cpp изменился следующим образом:
Код
C++ (Qt)
#include <QPaintEvent>
 
#include <QPainter>
#include <QImage>
#include <QTimer>
 
#include <QtGlobal>
 
const int SZ = 1000;
 
MyScene::MyScene( QWidget * parent ):
QWidget( parent )
{
_pen.setWidth( 1 );
_pen.setColor( Qt::red );
 
_leftPressed = false;
 
_image = new QImage( SZ, SZ, QImage::Format_ARGB32_Premultiplied );
_image->fill( Qt::white );
 
resize( SZ, SZ );
}
 
void MyScene::paintEvent( QPaintEvent * event )
{
QPainter painter( this );
QRect rect( event->rect() );
painter.drawImage( rect, *_image, rect );
}
 
void MyScene::mousePressEvent( QMouseEvent * event )
{
if ( event->button() == Qt::LeftButton ) {
_leftPressed = true;
_startPoint = event->pos();
}
}
 
void MyScene::mouseMoveEvent( QMouseEvent * event )
{
if ( _leftPressed ) {
_endPoint = event->pos();
QPainter painter( _image );
painter.drawLine( _startPoint, _endPoint );
QRect rect( qMin( _startPoint.x(), _endPoint.x() ),
qMin( _startPoint.y(), _endPoint.y() ),
qAbs( _startPoint.x() - _endPoint.x() ) + 1,
qAbs( _startPoint.y() - _endPoint.y() ) + 1 );
update( rect );
_startPoint = _endPoint;
}
}
 
void MyScene::mouseReleaseEvent( QMouseEvent *)
{
_leftPressed = false;
}
 
« Последнее редактирование: Январь 22, 2016, 06:29 от Pritcher » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Январь 22, 2016, 12:37 »

а насколько выгоднее рисовать по QImage вместо непосредственного рисования на виджете?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #17 : Январь 22, 2016, 12:49 »

а насколько выгоднее рисовать по QImage вместо непосредственного рисования на виджете?

Хотя бы то, что рисовать можно в любой момент времени, а не в paintEvent.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Январь 22, 2016, 13:00 »

а насколько выгоднее рисовать по QImage вместо непосредственного рисования на виджете?
Сейчас рисовать на QImage уже невыгодно т.к. окна кешируются. Но у ТС нет выбора т.к. предыдущие мазюкания должны сохраняться
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Январь 22, 2016, 13:07 »

в общем случае-то понятно. но вот применимо к задаче ТС — ведем мышкой и тут же рисуем — есть существенная разница рисовать в картинку или прямо на виджет?

к чему я это спрашиваю: сейчас пишу небольшую программку, которая рисует сетку, а пользователь водит мышкой и заполняет квадратики в сетке. рисую прямо на виджете, на каждое действие пользователя перерисовывается полностью все, визуально никаких проблем нет (ничего не тормозит). это хорошо или лучше рисовать в QImage? или сетку нарисовать на виджете, а квадратики рисовать в QImage?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #20 : Январь 22, 2016, 13:14 »

Если не тормозит, то и беспокоиться не надо.

PS преждевременная оптимизация это зло Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Январь 22, 2016, 13:15 »

Можно рисовать непосредственно на виджет. Я использую рисование на QImage,  в случаях когда картинку можно использовать для нескольких кадров. Например, сформировали фон и пока в нем ничего не меняется, использовать его кеш, а остальное рисовать поверх.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Январь 22, 2016, 13:40 »

в общем случае-то понятно. но вот применимо к задаче ТС — ведем мышкой и тут же рисуем — есть существенная разница рисовать в картинку или прямо на виджет?
"Прямо" точно быстрее. Насколько.. в OSX+Qt4.7 было намного, на Qt5 не мерял

к чему я это спрашиваю: сейчас пишу небольшую программку, которая рисует сетку, а пользователь водит мышкой и заполняет квадратики в сетке. рисую прямо на виджете, на каждое действие пользователя перерисовывается полностью все, визуально никаких проблем нет (ничего не тормозит). это хорошо или лучше рисовать в QImage? или сетку нарисовать на виджете, а квадратики рисовать в QImage?
Нужна приличная нагрузка (напр неск тысяч линий) чтобы они "заслуживали кеширования" в QImage. В Mac доках не раз мелькает "triple buffer" - поясняется почему

PS преждевременная оптимизация это зло Улыбающийся
Может когда-то (в ледниковый период) это выражение и имело смысл, но сейчас никакого, "дежурная отмазка" по абсолютно любому поводу
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #23 : Январь 22, 2016, 13:44 »

понял, всем спасибо!
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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