crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> 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 );
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(SABROG @ 5.6.2009, 9:56) *
А добавить на форму 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  


Попробуй так:

QSizeGrip *sgrip = new QSizeGrip(this);
sgrip->move(geometry().bottomRight());
updateGeometry();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(a_goodgirl @ 5.6.2009, 21:40) *
Большое спасибо SABROG!!!
а ты ему "Спасибо" нажми

С этим уголком не работал, но похоже что куча ручной работы обусловлена как раз тем, что декорации окна нет и уголку некчему липнуть.
Надо будет его исходник глянуть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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, в целом работающее верно, в частности дало странный результат:
_sgrip = new QSizeGrip(this);
    _gridLayout->addWidget(_sgrip);
    _gridLayout->setAlignment(_sgrip, Qt::AlignRight | Qt::AlignBottom);


Уголок прицепился снизу, НО посередине, несмотря на значение Alignment. Если же задать Qt::AlignLeft, то слева почему-то прикрепляется корректно. При этом resize event отслеживать действительно не надо.
Причина редактирования: используй тэг code

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 5.4.2020, 6:55