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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Получаю не правильный размер widget'a и маленький вопрос о include  (Прочитано 38896 раз)
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.093 секунд. Запросов: 23.