Странное поведение, перекрывающее QWidget :: resizeEvent (событие QResizeEvent *) - PullRequest
1 голос
/ 29 февраля 2012

Я разрабатываю графический интерфейс в Qt.у меня есть QWidget с четырьмя QPushButton внутри QHBoxLayout.Эти кнопки имеют значок каждая.Мне нужно переопределить QWidget::resizeEvent(QResizeEvent* event), потому что я не знаю точно, каким будет размер моего окна.То же самое для моих кнопок.Это значит, что я тоже должен изменить размеры иконок.Я думал разместить:

button1->setIconSize(button1->size());

внутри myWidget::resizeEvent(QResizeEvent* event), но когда я запускаю свое приложение, myWidget::resizeEvent вызывается рекурсивно .. Я пытался даже установить значок с помощью QtDesigner (eclipse plugin), но ничего ...Единственное, что дает хороший результат - это установка фиксированного размера кнопок, но это не то, что мне нужно.код resizeEvent:

void myWidget::resizeEvent(QResizeEvent* event) {

    this->QWidget::resizeEvent(event);
    ui.button1->setIconSize(ui.button1->size());
    ui.button2->setIconSize(ui.button2->size());
    ui.button3->setIconSize(ui.button3->size());
    ui.button4->setIconSize(ui.button4->size());

}

Почему resizeEvent вызывается рекурсивно с setIconSize?Есть ли кто-то, кто испытал ту же проблему?Предложения сделать то же самое, не проходя resizeEvent?

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Поскольку ваши кнопки находятся в макете, у вас есть следующий бесконечный цикл:

  1. Настройка размера значка изменяет размер кнопки.
  2. Изменение размера кнопок позволяет ретрансляции макета.
  3. Ретрансляция изменяет размеры виджета
  4. вызывается resizeEvent и задает размер значка
  5. Установка размера значка изменяет размеркнопка.
  6. Продолжите с 2 ...

Если вы хотите, чтобы кнопки соответствовали размеру кнопки, одним из способов был бы пользовательский подкласс QAbstractButton, который просто рисует растровое изображение в пользовательском paintEvent, масштабируяразмер растрового изображения до размера виджета (который примерно соответствует тому, что вы хотите?).Это не даст вам привычного внешнего вида кнопки (визуальная обратная связь при нажатии, наведение, рамка фокусировки и т. Д.).

0 голосов
/ 27 сентября 2013

Существует не очень чистое решение, но оно простое и выполнит свою работу.

В зависимости от количества элементов в вашем QWidget (то есть макетов, содержащих макеты и т. Д.), Могут быть2 или более автоматических операций изменения размера после того, как пользователь вручную меняет размер виджета.(Спасибо Фрэнку Остерфельду за указание на проблему)

Вы можете добавить счетчик внутри определения resizeEvent и выполнять код только в том случае, если ваш счетчик кратен числу операций автоматического изменения размера + 1 (вы можете найти этопутем пробной ошибки) и сбрасывает его в 0 при выполнении вашего кода, поэтому он также работает, когда вы максимизируете свой виджет.

Я просто новичок в QT, поэтому используйте этот подход с осторожностью, посколькуочень веские причины не использовать его, о котором я не знаю.

void
MyWidget::resizeEvent(QResizeEvent *event) 
{
   if((ignore_resize % num_of_auto_ops) == 0)
   {

      this->QWidget::resizeEvent(event);
      ui.button1->setIconSize(ui.button1->size());
      ui.button2->setIconSize(ui.button2->size());
      ui.button3->setIconSize(ui.button3->size());
      ui.button4->setIconSize(ui.button4->size());

      ignore_resize = 0;
   }
   ignore_resize++;
}
0 голосов
/ 08 июня 2013

Когда вы устанавливаете размер иконки на размер своего контейнера (метка, рамка), он переходит границу и вызывает изменение размера вашего контейнера, что приводит к бесконечной рекурсии. Если вы использовали

ui.button1->setIconSize(ui.button1->(size()-0.01));

у вас будет едва заметная разница в кнопке, и вы избежите бесконечной рекурсии.

...