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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прилипание диалога к краю экрана  (Прочитано 2575 раз)
XpycT
Гость
« : Июнь 22, 2010, 21:45 »

Привет, хотел сделать прилипание диалога к краю экрана, но что-то работает не совсем верно:
1) когда лепишь влево - высота диалога соскакивает на пикселей 15-20 вниз
2) когда леплю вправо - с указанным вручную значением(например 150 пикселей) лепится но не к краю, а когда указываю ширину диалога, он летит вниз , после чего крашится прога Улыбающийся

подскажите что не так:
Код
C++ (Qt)
void StatusWidget::moveEvent(QMoveEvent *e){
 
   const int OFFSET=5;
   const QRect screen = qApp->desktop()->availableGeometry(this);
   const QRect dialog = this->geometry();
   if( abs(dialog.left()-screen.left() < OFFSET ))
       this->move(screen.left(),dialog.top());
   else if( abs(dialog.right()> screen.right()-OFFSET ))
       this->move(screen.right()-dialog.width(),dialog.top());
   else if( abs(dialog.top()-screen.top() < OFFSET ))
       this->move(dialog.left(), screen.top());
}
Записан
sendevent
Гость
« Ответ #1 : Июнь 23, 2010, 00:16 »

генерация события из его обработчика может привести к бесконечной рекурсии со всеми вытекающими (из moveEvent'а не стоит вызовать move).

Код:
void MyWidget::mouseMoveEvent( QMouseEvent *event )
{
   QPoint click = event->globalPos();

   if( isWidgetMoving() ) //-- event->buttons() == Qt::LeftButton, etc
   {
       QRect currentGeom = geometry();
       QPoint newPos = mapToGlobal( this->pos() );
       QPoint delta = click - m_ptPrevPos;
       newPos += delta;
       currentGeom.moveTo( mapFromGlobal( newPos ) );

       move( stickToScreenEdges( delta, currentGeom ) );
   }
   
   ...
   
   m_ptPrevPos = click;

   QWidget::mouseMoveEvent( event );
}

QPoint MyWidget::stickToScreenEdges( const QPoint& ptClickDelta, QRect &widgetGeometry, int iPrecision/* = 16*/ ) const
{
   const QRect &screenGeometry = MyApplication::getScreenSize( m_ptPrevPos+ptClickDelta );//-- desktop under cursor geometry
   
   bool bEast2West = ptClickDelta.x() > 0; //-- < 0 ? right to left : left toright
   bool bNorth2South = ptClickDelta.y() > 0; //-- < 0 ? down to up : up to dow;
   
   //-- stick to current screen's left border:
   int iXDeltaLeft = widgetGeometry.topLeft().x() - screenGeometry.topLeft().x();
   if( !bEast2West && iXDeltaLeft <= iPrecision )
   {
       widgetGeometry.moveTopLeft( QPoint( screenGeometry.x(),
                                           widgetGeometry.topLeft().y() ) );
   }
   
   //-- stick to current screen's right border:
   int iXDeltaRight = screenGeometry.x() + screenGeometry.width() - widgetGeometry.topRight().x();
   if( bEast2West && iXDeltaRight <= iPrecision )
   {
       widgetGeometry.moveTopRight( QPoint( screenGeometry.x() + screenGeometry.width(),
                                            widgetGeometry.topRight().y() ) );
   }

   //-- stick to current screen's top border:
   int iYDeltaTop = widgetGeometry.topLeft().y() - screenGeometry.y() ;
   if( !bNorth2South && iYDeltaTop <= iPrecision )
   {
       widgetGeometry.moveTopLeft( QPoint( widgetGeometry.topLeft().x(),
                                           screenGeometry.y() ) );
   }
   
   //-- stick to current screen's bottom border:
   int iYDeltaBottom = screenGeometry.y() + screenGeometry.height() - widgetGeometry.bottomLeft().y();
   if( bNorth2South && iYDeltaBottom <= iPrecision )
   {
       widgetGeometry.moveBottomLeft( QPoint( widgetGeometry.bottomLeft().x(),
                                              screenGeometry.y() + screenGeometry.height() ) );
   }

   return widgetGeometry.topLeft();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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