Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kambala от Январь 23, 2016, 17:49



Название: подогнать размер окна под содержимое
Отправлено: kambala от Январь 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);
}


Название: Re: подогнать размер окна под содержимое
Отправлено: gil9red от Январь 23, 2016, 18:12
А может, наоборот сделать? Подгоните размер содержимого под размер окна :)


Название: Re: подогнать размер окна под содержимое
Отправлено: kambala от Январь 23, 2016, 18:40
размер виджета статический, но он может превышать размер экрана, потому там QScrollArea. либо я не понял о чем ты :)


Название: Re: подогнать размер окна под содержимое
Отправлено: Old от Январь 23, 2016, 18:48
По мне, так это не очень хорошее поведение. Пользователь должен сам решать, какого размера и где должно располагаться окно, тем более под капотом у вас QScrollArea.


Название: Re: подогнать размер окна под содержимое
Отправлено: panAlexey от Январь 26, 2016, 18:46
По мне, так это не очень хорошее поведение. Пользователь должен сам решать, какого размера и где должно располагаться окно, тем более под капотом у вас QScrollArea.
Но об юзвере и позаботиться нужно.


Название: Re: подогнать размер окна под содержимое
Отправлено: Igors от Январь 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);
 


Название: Re: подогнать размер окна под содержимое
Отправлено: kambala от Январь 27, 2016, 17:04
у меня окно уже есть :)

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


Название: Re: подогнать размер окна под содержимое
Отправлено: Igors от Январь 28, 2016, 09:13
у меня окно уже есть :)

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


Название: Re: подогнать размер окна под содержимое
Отправлено: kambala от Январь 28, 2016, 16:11
да, я понял. но у меня окно уже создано — контент отрисовывается в дочернем виджете и не при запуске приложения.