Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Natalie от Март 24, 2006, 15:45



Название: Окна, прилипающие друг к другу
Отправлено: Natalie от Март 24, 2006, 15:45
Есть два виджета (два окошка). Необходимо, чтобы они друг к другу прилипали, если подносить их близко друг к другу.

Мне говорили это можно сделать с помощью QDockWidget. Но как это именно сделать? Ведь при этом главного окна не должно быть видно. Но если главно окно сделать невидимым, то и все дочерние не будут видны.

Может кто-то такое делал... Подскажите, пожалуйста.


Название: Re: Окна, прилипающие друг к другу
Отправлено: Shama от Март 24, 2006, 18:07
Цитата: "Natalie"
Ведь при этом главного окна не должно быть видно. Но если главно окно сделать невидимым, то и все дочерние не будут видны.


Ну да, на то они и дочерние... вам надо сделать Dock окон или Виджетов всё-таки?


Название: Окна, прилипающие друг к другу
Отправлено: Natalie от Март 25, 2006, 13:38
Мне просто необходимо сделать так, чтобы два окна прилипали друг к другу.

Мне кажется, что QDockWidget для этой цели не подходит, но один человек мне сказал, что с помощью QDockWidget это сделать можно. Если QDockWidget не позволяет сделать такое, то как вообще это можно реализовать?

Может кто-то такое делал?


Название: Окна, прилипающие друг к другу
Отправлено: Dendy от Март 28, 2006, 09:57
QDockWidget здесь не помошник. Он завязан на QMainWindow и специальньІх областях прилипания. А тебе, я так понимаю, нужно что-то типа Winamp'а.

Я такое делал, только сразу предупреждение: За стандартньІй заголовок окошка лучше не тягать, ибо попьІтка изменить положение/размер окна по собьІтию SizeEvent/MoveEvent чревата бесконечной рекурсией. Лучше тягать за специальньІе участки или вообще убирать заголовок (как ето сделано в том же винампе).

Вот пример как я делал:

Код:
void Minimap::mousePressEvent( QMouseEvent * e )
{
if ( e->button() == Qt::LeftButton )
{
startpos = pos();
mousepos = e->globalPos();
}
}

void Minimap::mouseMoveEvent( QMouseEvent * e )
{
if ( e->buttons() & Qt::LeftButton )
{
QPoint off = e->globalPos() - mousepos;
if ( canDock( startpos + off ) )
dockMe();
else
move( startpos + off );
}
}


В canDock() проверяем куда можно прилипнуть в зависимости от неких областей прилипания, дистанции прилипания и прочего. Если можем, то липнем (двигаемся в ту точку), иначе - обьІчное движение окошка.