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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: подогнать размер окна под содержимое  (Прочитано 8557 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Январь 23, 2016, 17:49 »

Здравствуйте. Есть QMainWindow -> QScrollArea -> QWidget. Точный размер QWidget известен, хочу ресайзить окно чтобы весь QWidget влезал, но, естественно размер окна должен быть не более, чем qApp->desktop()->availableGeometry().

Имеющийся код не учитывает размер тайтлбара (во всяком случае под виндой, в мак ос вроде все четко), поскольку frameGeometry() возвращает размер не всего окна (а может и еще что-то не учтено), поэтому для большой высоты виджета окно немного вылазит за экран. Пока так и не придумал как правильно все рассчитать Грустный Пример виджета в аттаче.
Код
C++ (Qt)
void MainWindow::resizeToContents()
{
   if (isMaximized())
       return;
 
   auto nonogramSize = ui->gridWidget->nonogramSize();
   int addWidth = width() - ui->scrollArea->width(), addHeight = height() - ui->scrollArea->height();
   auto desktopRect = qApp->desktop()->availableGeometry();
   resize(desktopRect.size().boundedTo(QSize(nonogramSize.width() + addWidth, nonogramSize.height() + addHeight)));
 
   auto frame = frameGeometry();
   int maxX = frame.x() + frame.width(),  desktopMaxX = desktopRect.x() + desktopRect.width();
   int maxY = frame.y() + frame.height(), desktopMaxY = desktopRect.y() + desktopRect.height();
   auto p = pos();
   if (maxX > desktopMaxX)
       p.rx() -= maxX - desktopMaxX;
   if (maxY > desktopMaxY)
       p.ry() -= maxY - desktopMaxY;
   move(p);
}
« Последнее редактирование: Январь 23, 2016, 17:50 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 23, 2016, 18:12 »

А может, наоборот сделать? Подгоните размер содержимого под размер окна Улыбающийся
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Январь 23, 2016, 18:40 »

размер виджета статический, но он может превышать размер экрана, потому там QScrollArea. либо я не понял о чем ты Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Январь 23, 2016, 18:48 »

По мне, так это не очень хорошее поведение. Пользователь должен сам решать, какого размера и где должно располагаться окно, тем более под капотом у вас QScrollArea.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Январь 26, 2016, 18:46 »

По мне, так это не очень хорошее поведение. Пользователь должен сам решать, какого размера и где должно располагаться окно, тем более под капотом у вас QScrollArea.
Но об юзвере и позаботиться нужно.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 27, 2016, 08:43 »

Тоже мучился на Вындоуз. Беда в том что размеры "рамки" не дают пока нет окна. Родил такое
Код
C++ (Qt)
QRect R = qApp->desktop()->availableGeometry();
 
QWidget * doomed = new QWidget;
doomed->setGeometry(R);
doomed->winId();   // create system window
QMargins mg = doomed->windowHandle()->frameMargins();
delete doomed;
 
R = R.marginsRemoved(mg);
this->setGeometry(R);
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Январь 27, 2016, 17:04 »

у меня окно уже есть Улыбающийся

windowHandle() — странно, вроде смотрел документацию, а этого метода не нашел... спасибо!
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 28, 2016, 09:13 »

у меня окно уже есть Улыбающийся

windowHandle() — странно, вроде смотрел документацию, а этого метода не нашел... спасибо!
По умолчанию системное окно (окно Вындоуз) не создается до show, и windowHandle возвращает NULL. Если у Вас так, то не вызывайте windowId() для своего окна - это действие не безобидно, "тренируйтесь на кошках" (doomed).
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Январь 28, 2016, 16:11 »

да, я понял. но у меня окно уже создано — контент отрисовывается в дочернем виджете и не при запуске приложения.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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