QWidget без заголовка,но меняющий размеры?, Как сделать QWidget без заголовка, но чтобы менял размеры |
Здравствуйте, гость ( Вход | Регистрация )
QWidget без заголовка,но меняющий размеры?, Как сделать QWidget без заголовка, но чтобы менял размеры |
a_goodgirl |
4.6.2009, 17:59
Сообщение
#1
|
Студент Группа: Участник Сообщений: 35 Регистрация: 4.6.2009 Пользователь №: 801 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
kwisp |
4.6.2009, 20:34
Сообщение
#2
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
sendevent |
4.6.2009, 21:04
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 4.6.2009 Пользователь №: 802 Спасибо сказали: 0 раз(а) Репутация: 0 |
возможно, поможет связка QMenu+QWidgetAction+QWidget, и в QWidget::sizeHint() - определять оптимальный размер виджета? .
если же топлевел фреймлесс виджет нужен обязательно - изменения геометрии надо самостоятельно реализовать, примерно так: (реализовано омерзительно, сделать все по человечески - руки не доходят, так што звыняйте) CODE /*virtual*/ void FramelessWidget::mousePressEvent( QMouseEvent *event )
{ m_ptPrevPos = event->globalPos(); //-- m_eUIState - our enum: if( m_eUIState == UIS_NONE ) { if( canHorResize( m_ptPrevPos ) ) { m_eUIState = UIS_RESIZE_HOR; } else if( canVerResize( m_ptPrevPos ) ) { m_eUIState = UIS_RESIZE_VER; } //-- ui.pTitleWidget - TitleBar "emulator" else if( ui.pTitleWidget->rect().contains( ui.pTitleWidget->mapFromGlobal( m_ptPrevPos ) ) ) { m_eUIState = UIS_MOVE; } else { m_eUIState = UIS_NONE; } } QWidget::mouseReleaseEvent( event ); } /*virtual*/ void FramelessWidget::mouseReleaseEvent( QMouseEvent *event ) { m_eUIState = UIS_NONE; setCursor( Qt::ArrowCursor ); QWidget::mouseReleaseEvent( event ); } /*virtual*/ void FramelessWidget::mouseMoveEvent( QMouseEvent *event ) { QPoint click = event->globalPos(); if( qApp->keyboardModifiers() == Qt::NoModifier && event->buttons() == Qt::LeftButton ) { if( m_eUIState == UIS_RESIZE_VER ) { resizeVertical( click ); } else if( m_eUIState == UIS_RESIZE_HOR ) { resizeHorizontal( click ); } else if( m_eUIState == UIS_MOVE ) { QRect currentGeom = geometry(); QPoint newPos = mapToGlobal( this->pos() ); QPoint delta = click - m_ptPrevPos; newPos += delta; currentGeom.moveTo( mapFromGlobal( newPos ) ); setGeometry( currentGeom ); } } else { if( canVerResize( click ) ) { setCursor( Qt::SizeVerCursor ); } else if( canHorResize( click ) ) { setCursor( Qt::SizeHorCursor ); } else { setCursor( Qt::ArrowCursor ); } } m_ptPrevPos = click; QWidget::mouseMoveEvent( event ); } bool FramelessWidget::canHorResize( const QPoint& cursorPos ) { int cursX = cursorPos.x(); int myX = pos().x(); int myW = width(); int resizePrec = 5; if( ( cursX >= myX-resizePrec && cursX <= myX+resizePrec ) || ( cursX >= myX+myW-resizePrec && cursX <= myX+myW+resizePrec ) ) { return true; } return false; } bool FramelessWidget::canVerResize( const QPoint& cursorPos ) { int cursY = cursorPos.y(); int myY = pos().y(); int myH = height(); int resizePrec = 5; if( ( cursY >= myY-resizePrec && cursY <= myY+resizePrec ) || ( cursY >= myY+myH-resizePrec && cursY <= myY+myH+resizePrec ) ) { return true; } return false; } void FramelessWidget::resizeHorizontal( const QPoint& newPos ) { QPoint me = pos(); int middleX = pos().x() +width()/2; int delta = newPos.x() - m_ptPrevPos.x(); QRect geom = geometry(); if( newPos.x() > middleX ) {//-- right border used: geom.setWidth( width()+delta ); } else { QPoint topL = geom.topLeft(); topL.setX( topL.x() + delta ); geom.setTopLeft( topL ); geom.setWidth( width()-delta ); } setGeometry( geom ); } void FramelessWidget::resizeVertical( const QPoint& newPos ) { QPoint me = pos(); int middleY = pos().y() +height()/2; int delta = newPos.y() - m_ptPrevPos.y(); QRect geom = geometry(); if( newPos.y() > middleY ) { geom.setHeight( height()+delta ); } else { QPoint topL = geom.topLeft(); topL.setY( topL.y() + delta ); geom.setTopLeft( topL ); geom.setHeight( height()-delta ); } setGeometry( geom ); } |
|
|
Текстовая версия | Сейчас: 19.12.2024, 3:03 |