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 ); } |
|
|
SABROG |
5.6.2009, 8:56
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
А добавить на форму QSizeGrip вера не позволяет?
|
|
|
a_goodgirl |
5.6.2009, 12:00
Сообщение
#5
|
Студент Группа: Участник Сообщений: 35 Регистрация: 4.6.2009 Пользователь №: 801 Спасибо сказали: 0 раз(а) Репутация: 0 |
А добавить на форму QSizeGrip вера не позволяет? Большое спасибо за QSizeGrip! С помощью гугления найти его использование удалось только для комбобокса. Но вроде там все просто: в класс class ContourFilterDialog: public QWidget в конструктор добавлено: QSizeGrip *sgrip = new QSizeGrip(this); Но при этом уголок для растягивания появляется в левом верхнем углу! (и окно растягивается тоже вверх и влево). Хотя в документации написано: "Resize grips are usually rendered as small diagonal textured lines in the lower-right corner." Если нетрудно помочь - как управлять расположением уголка? |
|
|
SABROG |
5.6.2009, 12:53
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Попробуй так:
|
|
|
a_goodgirl |
5.6.2009, 17:40
Сообщение
#7
|
Студент Группа: Участник Сообщений: 35 Регистрация: 4.6.2009 Пользователь №: 801 Спасибо сказали: 0 раз(а) Репутация: 0 |
Большое спасибо SABROG!!!
В целом работает, с небольшими поправками: надо перемещать не в угол, а в _sgrip->move(QPoint(width()-_sgrip->width(), height()-_sgrip->height())); и еще приходится отслеживать resizeEvent и делать там то же самое, а то уголок "теряется" |
|
|
Litkevich Yuriy |
5.6.2009, 17:47
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
5.6.2009, 18:01
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Как мне кажется, нужно добавить на форму layout, поместить на него QSizeGrip и вызвать bool QLayout::setAlignment ( QWidget * w, Qt::Alignment alignment )
|
|
|
a_goodgirl |
9.6.2009, 13:08
Сообщение
#10
|
Студент Группа: Участник Сообщений: 35 Регистрация: 4.6.2009 Пользователь №: 801 Спасибо сказали: 0 раз(а) Репутация: 0 |
предложение SABROG, в целом работающее верно, в частности дало странный результат:
Уголок прицепился снизу, НО посередине, несмотря на значение Alignment. Если же задать Qt::AlignLeft, то слева почему-то прикрепляется корректно. При этом resize event отслеживать действительно не надо.
Причина редактирования: используй тэг code
|
|
|
Текстовая версия | Сейчас: 23.12.2024, 1:50 |