Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ground от Июнь 19, 2012, 15:43



Название: Как отловить изменение свойства maximized у окна?
Отправлено: 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)
Кто-то шлет второй сигнал для восстановления в состояние, в котором было окно до разворачивания.


Название: Re: Как отловить изменение свойства maximized у окна?
Отправлено: mutineer от Июнь 19, 2012, 16:39
может QMainWindow::changeEvent(event) ресайзит в нормальное состояние?


Название: Re: Как отловить изменение свойства maximized у окна?
Отправлено: Ground от Июнь 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 состоянии, не разворачивая его?


Название: Re: Как отловить изменение свойства maximized у окна?
Отправлено: Ground от Июнь 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. Если равен, событие дальше не пропускаем, а меняем значение размера на нужную нам величину.