Привет, хотел сделать прилипание диалога к краю экрана, но что-то работает не совсем верно:
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());
}
генерация события из его обработчика может привести к бесконечной рекурсии со всеми вытекающими (из 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();
}