Как рисовать виджеты Qt в QTabWidget на невыбранных вкладках?

#c #qt #qtwidgets

#c #qt #qtwidgets

Вопрос:

У моего QTabWidget есть 2 вкладки при запуске.

  • Вкладка 1 — это та, которая открывается при запуске.
  • Вкладка 2 содержит некоторые виджеты, которые я использую QSize , чтобы позже рисовать похожие элементы на вновь открытых вкладках.

Проблема в том, что в настоящее время размер элементов составляет 640×480 (по-видимому, значение по умолчанию), если вкладка 2 еще не была показана. Как только выбрана вкладка 2, элементы «рисуются» и получают свои размеры в зависимости от разрешения, размера окна и т.д.
Как я могу принудительно отрисовывать элементы в фоновом режиме, не открывая вкладку 2, чтобы я мог получить размеры, которые имели бы элементы, если бы вкладка была открыта? repaint и update не делайте этого.

Мой текущий обходной путь — запустить с открытой вкладкой 2 и переключиться на вкладку 1 main.cpp между myWindow.show() ними, myApp.exec() но это кажется немного грязным.

Комментарии:

1. Имеет ли виджет tab 2 макет?

2. Я думаю, вы можете захотеть вызвать sizeHint() , а не size()

3. @JeremyFriesner спасибо, это сработало, если вы хотите сделать это ответом, я приму его,

Ответ №1:

По соображениям производительности size() метод QWidget не гарантирует возврата ожидаемого значения до тех пор, пока QWidget не будет фактически выложен и показан.

Если вам нужно заранее знать, каким будет размер QWidget, вы можете вместо этого вызвать его sizeHint() метод, и это заставит выполнить вычисление сразу, чтобы можно было вернуть правильный размер, даже если он еще не был вычислен.

Ответ №2:

согласно документу, resizeEvent никогда не вызывался, когда виджет не виден, а также paintEvent. это обычная процедура для уменьшения затрат на обработку и сокращения процесса рендеринга. если вы хотите знать, когда изменился размер tab1, переопределите (переопределите) resizeEvent и скажите, что размер tab2 должен быть изменен.

Комментарии:

1. Спасибо за информацию с resizeEvent. Но я не хочу знать, когда изменяется размер вкладки, а как принудительно изменить первый размер. Уже отмечалось, что здесь работает функция sizeHint().