crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QWidget без заголовка,но меняющий размеры?, Как сделать QWidget без заголовка, но чтобы менял размеры
a_goodgirl
  опции профиля:
сообщение 4.6.2009, 17:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нужно, чтобы QWidget "выпадал" как меню - т.е. имел вид "без заголовка" (см. картинку). Сделать это можно с помощью
setWindowFlags(Qt::Popup);
Но при этом окно становится не способным менять размер, а нужно его растягивать!
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kwisp
  опции профиля:
сообщение 4.6.2009, 20:34
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(a_goodgirl @ 4.6.2009, 18:59) *
setWindowFlags(Qt::Popup);
Но при этом окно становится не способным м

вроде не только таким флагом:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 );
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.12.2024, 3:03