Я изучаю и модифицирую пример fridge magnets, и последнее, что я пытался сделать, это нарисовать несколько меток и линий, которые должны быть на заднем плане.QWidget's paintEvent() lagging application
Осмотревшись, пытаясь понять, как рисовать метки и линии, я узнал, что могу переопределить paintEvent() QWidget, чтобы сделать это. После того, как я это сделал, приложение получило лагги, и я узнал, что это потому, что paintEvent() вызывается в бесконечно замкнутом цикле.
Попытка выяснить, как это исправить, я переместил код, который нарисовал метки и строки для конструктора класса. Тем не менее, только ярлыки были нанесены на приложение. После этого я оставил ярлыки в конструкторе, но переместил код, который нарисовал строки, чтобы рисоватьEvent(). Он работал, линии были нарисованы так, как ожидалось, и paintEvent() вызывается только при перетаскивании материала вокруг.
Почему строки не были нарисованы на конструкторе и почему paintEvent() попал в бесконечный цикл?
Вот фрагмент кода, который должен нарисовать этикетки и линии:
QPen pen(Qt::lightGray, 0, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin);
QPainter paint(this);
paint.setPen(pen);
int scale = 20;
for(int x=0; x<25; x++){
QString timetext= "0"+QString::number(x)+":00";
QLabel *time= new QLabel(timetext,this);
time->move(x*scale,2);
time->show();
paint.drawLine(x*scale,12,x*scale,400);
}
Должен ли я переместить весь код рисования из конструктора и в paintEvent? –
Да, рисунок должен выполняться только в paintEvent(). Или вы можете нарисовать QPixmap, который является фоном виджета (чаще всего QLabel). Затем вы будете рисовать только один раз (через некоторое время), не касаясь самой paintEvent(). Это зависит от вашего приложения. Обратите внимание, что (повторное) выполнение рисования в paintEvent() не так дорого, как можно было бы подумать. В большинстве случаев Qt использует двойную буферизацию, поэтому просто перемещение окон вокруг не приведет к paintEvent(). С другой стороны, например, на удаленных сеансах двойная буферизация не действует. – ypnos