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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Функция центрирования окна по середине монитора  (Прочитано 13142 раз)
merke
Гость
« : Август 24, 2010, 09:33 »

Код:
void MainWindow::centerOnDesktop()
{
    quint16 screenWidth, width, screenHeight, height, x, y;
    QSize windowSize;

    screenWidth = QApplication::desktop()->width();
    screenHeight = QApplication::desktop()->height();
    windowSize = size();
    width = windowSize.width();
    height = windowSize.height();
    x = (screenWidth - width) / 2;
    y = (screenHeight - height) / 2;
    y -= 100;
    move(x, y);
}

Как использовать догадается каждый - в конструкторе вызываем данную функцию.

Более короткая реализация данной функции:

Код:
void Widget::moveToCenter()
{
    move(qApp->desktop()->availableGeometry(this).center()-rect().center());
}
Записан
BRE
Гость
« Ответ #1 : Август 24, 2010, 09:50 »

Более короткая реализация данной функции:
Это не просто более коротка реализация, но и более универсальная.
В твоем варианте, ты рассчитываешь позицию окна, будучи уверенным, что панель управления находиться внизу экрана и имеет высоту 100 пикселей.
К сожалению, это далеко не всегда так.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Май 03, 2011, 21:48 »

Странно, а у меня в xubuntu этот способ работает только если его положить в обработчик:
Код
C++ (Qt)
void MainWindow::resizeEvent(QResizeEvent* evt)
{
 Q_UNUSED(evt)
  this->QMainWindow::move(qApp->desktop()->availableGeometry(this).center() - this->QMainWindow::rect().center());
}
 

А если эту строку просто добавить в конце построения гуя главного окна - не работает, становится не по центру. Может быть тут виновато "умное размещение окон" свойств xfce.
« Последнее редактирование: Май 03, 2011, 21:56 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 04, 2011, 08:31 »

Нужно просто перед центровкой вызвать QWidget::adjustSize(), чтобы отработала компановка.

Вот, имхо, более правильный код:
Код
C++ (Qt)
#include <QApplication>
#include <QDesktopWidget>
 
void CenterWindow( QWidget* win )
{
QWidget* w = win->parentWidget();
 
win->adjustSize();
 
// need to make sure these events are already sent to be sure
// our information below is correct
QApplication::sendPostedEvents( win, QEvent::LayoutHint );
QApplication::sendPostedEvents( win, QEvent::Resize );
 
QPoint p( 0, 0 );
int extraw = 0, extrah = 0, scrn = 0;
if ( w )
w = w->topLevelWidget();
QRect desk;
if ( w )
scrn = QApplication::desktop()->screenNumber( w );
else if ( QApplication::desktop()->isVirtualDesktop() )
scrn = QApplication::desktop()->screenNumber( QCursor::pos() );
else
scrn = QApplication::desktop()->screenNumber( win );
desk = QApplication::desktop()->availableGeometry( scrn );
 
QWidgetList wl( QApplication::topLevelWidgets() );
for( QWidgetList::iterator it = wl.begin();
( extraw == 0 || extrah == 0 ) && it != wl.end(); ++it )
{
int framew, frameh;
QWidget* current = *it;
 
if ( ! current->isVisible() )
continue;
 
framew = current->geometry().x() - current->x();
frameh = current->geometry().y() - current->y();
 
extraw = QMAX( extraw, framew );
extrah = QMAX( extrah, frameh );
}
 
   // sanity check for decoration frames. With embedding, we
   // might get extraordinary values
if ( extraw == 0 || extrah == 0 || extraw >= 10 || extrah >= 40 )
{
extrah = 40;
extraw = 10;
}
 
#ifndef Q_OS_TEMP
if ( w )
{
// Use mapToGlobal rather than geometry() in case w might
// be embedded in another application
QPoint pp = w->mapToGlobal( QPoint( 0, 0) );
p = QPoint( pp.x() + w->width() / 2, pp.y() + w->height() / 2 );
} else
{
// p = middle of the desktop
p = QPoint( desk.x() + desk.width() / 2, desk.y() + desk.height() / 2 );
}
#else
p = QPoint( desk.x() + desk.width() / 2, desk.y() + desk.height() / 2 );
#endif
 
// p = origin of this
p = QPoint( p.x() - dlg->width() / 2 - extraw,
p.y() - dlg->height() / 2 - extrah );
 
if ( p.x() + extraw + dlg->width() > desk.x() + desk.width() )
p.setX( desk.x() + desk.width() - dlg->width() - extraw );
if ( p.x() < desk.x() )
p.setX( desk.x() );
 
if ( p.y() + extrah + dlg->height() > desk.y() + desk.height() )
p.setY( desk.y() + desk.height() - dlg->height() - extrah );
if ( p.y() < desk.y() )
p.setY( desk.y() );
 
win->move( p );
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
nes
Гость
« Ответ #4 : Сентябрь 18, 2015, 20:36 »

у меня окно как QWidget и эта одно строка работает как на вин, мак так и линукс убунту.

Код:
this->move(QApplication::desktop()->screen()->rect().center() - this->rect().center());
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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