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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мигание QGLWdget  (Прочитано 3498 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 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];
 
Последняя длинная строка гадит на экране - но попасть "внутрь" я не могу, отладчик туда не заходит. Как мне узнать куда отдано управление?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Январь 11, 2015, 20:14 »

это ж уже внутренности нативного фреймворка, класса NSWindow. или интересует именно ассемблерный код?
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 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. Как избавиться от этого навязчивого сервиса? (на Вындоуз его нет)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 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 конечно тоже отдыхает..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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