Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: phpCoder от Январь 09, 2015, 15:03



Название: Как дорисовать точку?
Отправлено: phpCoder от Январь 09, 2015, 15:03
Есть виджет. По нему тыкают мышью - на экране должна нарисоваться точка в месте, где тыкнули. Как нарисовать там точку?
Непонятно:
1. как собственно дорисовать точку. Именно ДОрисовать, а не перерисовать весь экран?
2. настройка рисовальщика. Смотрел примеры - какие-то они убогие. Везде в paintEvent определяется Qpainter, его настройки и прочее. Это что же получается: миллиард раз этот метод будет вызван, миллиард раз создастся пейнтер и в миллиардный раз в него поставят те же самые настройки?
А я хочу определить его в конструкторе класса, запихнуть в него все что нужно - антиалиасинг, ручку и т.д. и уже после этого рисовать. Что для этого нужно?


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 15:09
Вы не представляете себе всех широт открытий. Да, именно 100500 раз будет вызван пейнтер и перерисован) А чтобы вам дорисовать точечку, то надо лишь добавить свою секцию отрисовки в paintEvent :D


Название: Re: Как дорисовать точку?
Отправлено: phpCoder от Январь 09, 2015, 15:14
Зачем так по-глупому сделано? 100500 раз выполнить однотипные действия... - это же не приложение будет, а улитка какая-то.


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 15:23
Скорость отрисовки на уровне) А вы никогда не задумывались, что при нажатии кнопки перерисовывается эдак 400-500 точек ) А при слайдинге перерисовывается до несколько сотен тысяч за пару секунд :D

PS не парься, всё быстро и путём :)


Название: Re: Как дорисовать точку?
Отправлено: phpCoder от Январь 09, 2015, 16:36
Ну и как дорисовать точку?

Точек два вида - одни красные и круглые, а другие - синие и квадратные. Тип задает юзером через комбобокс. Точки складируются в массив. Тип точки - тоже в массив.

В paintEvent прогонять массив в цикле и сменять на каждой итерации ручку не хочу. Это извращение.
Как тогда?


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 17:03
Точки всегда квадратные ибо пиксель квадратный :D

У вас видимо круги и квадраты :)

А что вы предлагаете? Как вы ещё можете отрисовать N количество кругов и квадратов, кроме как храня их координаты в массиве и проходя по ним в цикле? :)

PS может вы придумаете новый способ или конструкцию языка для этого?


Название: Re: Как дорисовать точку?
Отправлено: Old от Январь 09, 2015, 17:47
PS может вы придумаете новый способ или конструкцию языка для этого?
Можно дорисовывать фигуры на QImage, а уже его рисовать на виджет.


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 19:13
Ну и стоить добавить, что Qt так и делает :)


Название: Re: Как дорисовать точку?
Отправлено: Old от Январь 09, 2015, 19:16
Ну и стоить добавить, что Qt так и делает :)
При чем здесь Qt?


Название: Re: Как дорисовать точку?
Отправлено: Kurles от Январь 09, 2015, 21:05
PS может вы придумаете новый способ или конструкцию языка для этого?
Можно дорисовывать фигуры на QImage, а уже его рисовать на виджет.

Тогда следующая тема будет называться "как удалить точку"  ;) :D


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 21:27
Потому что Qt использует двойную буферизацию и в качестве буфера по умолчанию QImage :)
Так что  принцип тот же :D

PS оммм, хотя в пятерке хз как :)


Название: Re: Как дорисовать точку?
Отправлено: Old от Январь 09, 2015, 21:39
Потому что Qt использует двойную буферизацию и в качестве буфера по умолчанию QImage :)
Так что  принцип тот же :D

PS оммм, хотя в пятерке хз как :)
Да какая разница, как это где делается.

Вы сокрушались, что других способов нет:
Как вы ещё можете отрисовать N количество кругов и квадратов, кроме как храня их координаты в массиве и проходя по ним в цикле? :)

Я вам предложил еще один вариант.


Название: Re: Как дорисовать точку?
Отправлено: Hrundel от Январь 09, 2015, 22:31
Ну и как дорисовать точку?

Точек два вида - одни красные и круглые, а другие - синие и квадратные. Тип задает юзером через комбобокс. Точки складируются в массив. Тип точки - тоже в массив.

В paintEvent прогонять массив в цикле и сменять на каждой итерации ручку не хочу. Это извращение.
Как тогда?

А может быть для начала лучше книжку Шлее почитать? Там и про точечки, и про кружочки,... и даже про квадратики.


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 09, 2015, 23:01
Old, чтобы отрисовать кучу кружочков и квадратиков нужно всё равно
Цитировать
прогонять массив в цикле
.
Твоё предложение это скорее просто перенос того же кода в другое место :)


Название: Re: Как дорисовать точку?
Отправлено: Old от Январь 09, 2015, 23:07
Old, чтобы отрисовать кучу кружочков и квадратиков нужно всё равно
Цитировать
прогонять массив в цикле
.
Твоё предложение это скорее просто перенос того же кода в другое место :)
Какой массив?
Юзер клацнул в экран - нарисовали фигуру, еще раз клацнул - еще одну.


Название: Re: Как дорисовать точку?
Отправлено: kambala от Январь 10, 2015, 00:00
В paintEvent прогонять массив в цикле и сменять на каждой итерации ручку не хочу. Это извращение.
Как тогда?
пройдись сперва по четным индексам, а потом — по нечетным (ну или наоборот)


Название: Re: Как дорисовать точку?
Отправлено: Bepec от Январь 10, 2015, 00:37
Old тут уже вмешиваются мои мысли о функционале - вполне возможно надо будет как то классифицировать точки в будущем, иметь возможность отменить последнюю и прочая :) Следовательно нужен будет массив данных, пусть и отрисовывающийся единожды :)


Название: Re: Как дорисовать точку?
Отправлено: Igors от Январь 10, 2015, 10:12
Кстати о птичках - рисовать адаптивно можно
Код
C++ (Qt)
#include <QtWidgets>
 
class MyWidget : public QWidget {
public:
MyWidget( QWidget * parent = 0 ) : QWidget(parent)
{
setAttribute(Qt::WA_NoSystemBackground);
}
 
void paintEvent( QPaintEvent * )
{
static int theCount = 0;
static const int NUM_COLOR = 3;
static const Qt::GlobalColor theColor[NUM_COLOR] = { Qt::red, Qt::green, Qt::blue };
static const QPoint delta(15, 15);
 
QPainter painter(this);
painter.setPen(QColor(theColor[theCount]));
theCount = (theCount + 1) % NUM_COLOR;
QPoint pt = mapFromGlobal(QCursor::pos());
QRect R(pt - delta, pt + delta);
painter.drawEllipse(R);
}
 
void mousePressEvent( QMouseEvent * )
{
update();
}
 
};
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
MyWidget * win = new MyWidget;
win->setWindowTitle("Click to paint");
win->show();
 
return app.exec();
}
 
Во всяком случае с пятеркой работает на OSX и Вындоуз