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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Получаю не правильный размер widget'a и маленький вопрос о include  (Прочитано 40378 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Декабря 13, 2009, 20:57 »

Как я и писал в конце метода вызывать qApp->processEvents() и получать после него или ставить в очередь вызов слота (Qt::QueuedConnection). Естественно, что размеры виджета могут тут же поменяться на другие после того как они уже были получены, просто нужно дополнять документацию, чтобы народ не удивлялся.
processEvents и экран обновит и много чего может еще сделать что к размерам не имеет отношения. Коряво, хотя согласен - лучшего не видно (в текущей версии)
Записан
BRE
Гость
« Ответ #16 : Декабря 13, 2009, 21:00 »

По-умолчанию для текущего фонта, текущего текста, текущих ограничений на размер, итд...
А для чего нужен этот размер, если он тут-же измениться компоновщиком?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Декабря 13, 2009, 21:07 »

А для чего нужен этот размер, если он тут-же измениться компоновщиком?
То уже я возьму на себя. Было бы замечательно если перед вызовом mainWindow->show() я мог бы вызвать что-то типа mainWindow->adjustSize() и получить все размеры как они будут на экране
Записан
spectre71
Гость
« Ответ #18 : Декабря 13, 2009, 21:07 »

Как я и писал в конце метода вызывать qApp->processEvents() и получать после него или ставить в очередь вызов слота (Qt::QueuedConnection). Естественно, что размеры виджета могут тут же поменяться на другие после того как они уже были получены, просто нужно дополнять документацию, чтобы народ не удивлялся.

Никак не решает проблему если необходимо узнать размеры в конструкторе.
Записан
BRE
Гость
« Ответ #19 : Декабря 13, 2009, 21:10 »

То уже я возьму на себя. Было бы замечательно если перед вызовом mainWindow->show() я мог бы вызвать что-то типа mainWindow->adjustSize() и получить все размеры как они будут на экране
Это уже получение размера не в конструкторе, не?
Записан
spectre71
Гость
« Ответ #20 : Декабря 13, 2009, 21:13 »

По-умолчанию для текущего фонта, текущего текста, текущих ограничений на размер, итд...
А для чего нужен этот размер, если он тут-же измениться компоновщиком?

Для описанного тобой примера - смысла мало.
А вот получение размеров элементов в конце конструктора окна очень даже важно:
MyWindow::MyWindow () {
...
...
calculateSize();

// get children sizes

}

И в любой другой момент если необходимо
« Последнее редактирование: Декабря 13, 2009, 21:15 от Spectre » Записан
BRE
Гость
« Ответ #21 : Декабря 13, 2009, 21:15 »

То уже я возьму на себя. Было бы замечательно если перед вызовом mainWindow->show() я мог бы вызвать что-то типа mainWindow->adjustSize() и получить все размеры как они будут на экране
А откуда adjustSize узнает что ты будешь вызывать именно show(), а не showFullScreen() или showMaximized()?
Записан
spectre71
Гость
« Ответ #22 : Декабря 13, 2009, 21:25 »

Кстати в текущей концепции QT, со всем этим связана очень большая кривизна - невозможно получить размеры для виджетов которые еще не были визуализированы, т.е. которые не были isVisible()!

Пример того что меня уже достало:
Не устанавливаются правильные размеры QTableWidget - пока не перещелкнешь все закладки, и обязательно после его визуализации, и обязательно через processEvents()
« Последнее редактирование: Декабря 13, 2009, 21:33 от Spectre » Записан
BRE
Гость
« Ответ #23 : Декабря 13, 2009, 21:31 »

Код
C++ (Qt)
QVBoxLayout *layout = new QVBoxLayout( this );
 
QTextEdit *textEdit = new QTextEdit( this );
layout->addWidget( textEdit );
 
setLayout( layout );
 
resize( 200, 200 );
 
qDebug() << textEdit->size();
 
layout->activate();
 
qDebug() << textEdit->size();
 
Цитировать
QSize(100, 30)
QSize(178, 178)
Записан
spectre71
Гость
« Ответ #24 : Декабря 13, 2009, 21:33 »

Пример того что меня уже достало:
Не устанавливаются правильные размеры QTableWidget - пока не перещелкнешь все закладки, и обязательно после его визуализации, и обязательно через processEvents()

Поясняю:
Имеем диалог с закладками. Задача сделать фиксированный минимальный размер этого диалога.
Задача не решаема - зависит от выбранной закладки. Если изначально была выбрана закладка с суммарно меньшим возможным размером элементов, то при переключении пользователем на закладку с суммарно большим размером элементов - диалог изменит размеры.
Записан
spectre71
Гость
« Ответ #25 : Декабря 13, 2009, 21:36 »

Извиняюсь не QTableWidget, а QTabWidget.
Записан
BRE
Гость
« Ответ #26 : Декабря 13, 2009, 21:38 »

Поясняю:
Имеем диалог с закладками. Задача сделать фиксированный минимальный размер этого диалога.
Задача не решаема - зависит от выбранной закладки. Если изначально была выбрана закладка с суммарно меньшим возможным размером элементов, то при переключении пользователем на закладку с суммарно большим размером элементов - диалог изменит размеры.
Это да, такая же фигня и у меня, тут только с большим бубном...  Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Декабря 13, 2009, 21:45 »

А откуда adjustSize узнает что ты будешь вызывать именно show(), а не showFullScreen() или showMaximized()?
А мне не нужно "на все случаи" - пусть сделает для размеров установленных setSize. А когда у меня получившиеся размеры будут на руках я задам кому надо setMinimumSize/setMaximumSize а остальное пусть лайауты занимаются. Так ведь нет такой возможности  Плачущий
Записан
spectre71
Гость
« Ответ #28 : Декабря 13, 2009, 21:46 »

Код
C++ (Qt)
QVBoxLayout *layout = new QVBoxLayout( this );
 
QTextEdit *textEdit = new QTextEdit( this );
layout->addWidget( textEdit );
 
setLayout( layout );
 
resize( 200, 200 );
 
qDebug() << textEdit->size();
 
layout->activate();
 
qDebug() << textEdit->size();
 
Цитировать
QSize(100, 30)
QSize(178, 178)

Ну и все нормально.
А теперь вызываем this->calculateSize(); и получаем для textEdit правильные размеры, актуальные пока у окна(this) чего-то не добавили/изменили
Записан
BRE
Гость
« Ответ #29 : Декабря 13, 2009, 21:48 »

Тогда все нормально, все что хотели получаем?  Улыбающийся
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


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