Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: Igors от Январь 11, 2015, 19:41



Название: Мигание QGLWdget
Отправлено: Igors от Январь 11, 2015, 19:41
Добрый день

QGLWidget неприятно мигает при ресайзе окна в котором он находится. Сначала он перерисовывается черным или мусором, а потом уже вызывается все как положено (paintEvent, drawGL). Потыкал разные флаги - не помогло. Ладно, погнал в отладчике, дошел до места
Код
C++ (Qt)
if (m_nsWindow) {
 NSRect bounds = qt_mac_flipRect(rect);
 [m_nsWindow setFrame:[m_nsWindow frameRectForContentRect:bounds] display:YES animate:NO];
 
Последняя длинная строка гадит на экране - но попасть "внутрь" я не могу, отладчик туда не заходит. Как мне узнать куда отдано управление?

Спасибо


Название: Re: Мигание QGLWdget
Отправлено: kambala от Январь 11, 2015, 20:14
это ж уже внутренности нативного фреймворка, класса NSWindow. или интересует именно ассемблерный код?


Название: Re: Мигание QGLWdget
Отправлено: Igors от Январь 12, 2015, 10:51
это ж уже внутренности нативного фреймворка, класса NSWindow. или интересует именно ассемблерный код?
Ну плутать в дебрях ОС (в ассемблере) в мои планы не входит :) Но может он где-то зовет что-то типа callback.

Собственно QGLWdget здесь ни при чем, он просто отрисовывается значительно медленнее и проблема становится видна невооруженным глазом. Вот тестовый пример
Код
C++ (Qt)
#include <QtWidgets>
 
class MyWidget : public QWidget {
public:
void mousePressEvent( QMouseEvent * )
{
int w = width();
int h = height();
w += (w < 800) ? 100 : -100;
h += (h < 800) ? 100 : -100;
resize(w, h);
QThread::msleep(2 * 1000);
}
};
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
MyWidget * win = new MyWidget;
QVBoxLayout * layout = new QVBoxLayout(win);
win->setLayout(layout);
win->setWindowTitle("Click me");
win->resize(300, 200);
layout->addWidget(new QLabel("Some Text", win));
 
win->show();
 
return app.exec();
}
 
Первая картинка - начальное окно. Вторая - после вызова resize, Третья - после перерисовки. Т.е. сначала окно масштабится как bitmap и рисуется (c QGLWidget это не катит, поэтому мусор) - и только потом цивильная перерисовка через paintEvent. Как избавиться от этого навязчивого сервиса? (на Вындоуз его нет)


Название: Re: Мигание QGLWdget
Отправлено: Igors от Январь 12, 2015, 14:33
Цитировать
you can use either [NSWindow disableScreenUpdatesUntilFlush] or the global NSDisableScreenUpdates() and NSEnableScreenUpdates() functions to prevent the screen updating until you're ready.
Не имеет эффекта (а так логично выглядит  :)). Ну setUpdatesEbabled конечно тоже отдыхает..