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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить изменение свойства maximized у окна?  (Прочитано 6087 раз)
Ground
Гость
« : Июнь 19, 2012, 15:43 »

Доброго времени суток!
Подскажите, как отловить действие пользователя, обратное разворачиванию на весь экран ("Свернуть в окно"). Мне нужно установить для окна фиксированный размер после этого действия.
Я как-то попробовал поработать с changeEvent, получилось из этого примерно следующее:
Код
C++ (Qt)
// Изменение состояния окна
void MainWindow::changeEvent(QEvent* event)
{
   qDebug()<<"changeEvent"<<event->type();
   bool exp1 = event->type() == QEvent::WindowStateChange;
   bool exp2 = !this->isMaximized();
   if (exp1 && exp2)
   {
       this->resize(200, 200);
   }
   return QMainWindow::changeEvent(event);
}
Но не работает. Причем не работает странно. Если нажать на кнопку "Свернуть в окно", то окно не меняет размеров. А если отдернуть от края экрана (в Win7), то размер меняется.
В чем может быть дело?

Вот дебаго-вывод:
Код
C++ (Qt)
changeEvent 105 // Разворот на весь экран
resizeEvent QSize(1920, 1018)
changeEvent 105 // Сворачивание в окно
resizeEvent QSize(200, 200)
resizeEvent QSize(500, 500)
Кто-то шлет второй сигнал для восстановления в состояние, в котором было окно до разворачивания.
« Последнее редактирование: Июнь 19, 2012, 16:14 от Ground » Записан
mutineer
Гость
« Ответ #1 : Июнь 19, 2012, 16:39 »

может QMainWindow::changeEvent(event) ресайзит в нормальное состояние?
Записан
Ground
Гость
« Ответ #2 : Июнь 19, 2012, 16:41 »

Пробовал вот так:
Код
C++ (Qt)
// Изменение состояния окна
void MainWindow::changeEvent(QEvent* event)
{
   qDebug()<<"changeEvent"<<event->type();
   bool exp1 = event->type() == QEvent::WindowStateChange;
   bool exp2 = !this->isMaximized();
   if (exp1 && exp2)
   {
       this->resize(200, 200);
       return; // Ну или event->accept();
   }
   return QMainWindow::changeEvent(event);
}
Результат один и тот же.
А можно как-нибудь узнать размер, который окно займет в maximize состоянии, не разворачивая его?
Записан
Ground
Гость
« Ответ #3 : Июнь 20, 2012, 03:02 »

Решил проблему следующим кодом:
Код
C++ (Qt)
void MainWindow::resizeEvent(QResizeEvent *event)
{
   if (this->isMaximized())
       mFullScreenSize = this->size();
   if (event->oldSize() == event->size())
       return;
   else if (event->oldSize() == mFullScreenSize)
       return this->resize(200, 200);
   return QMainWindow::resizeEvent(event);
}

Добавляем переменную QSize mFullScreenSize, где сохраняем размер экрана в полноэкранном режиме. Далее в событии проверяем, равен ли старый размер окна - mFullScreenSize. Если равен, событие дальше не пропускаем, а меняем значение размера на нужную нам величину.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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