Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: QCasper от Декабрь 19, 2006, 01:00



Название: QDockWidget - автоматическая подстройка размера
Отправлено: QCasper от Декабрь 19, 2006, 01:00
QMainWindow - на нем QDockWidget - на нем некий виджет, допустим кнопка. Теперь представьте тебе ситуацию, я отстыковываю доквиджет, и его размер остается тот же, и кнопка растянунта по нему всему. А как сделать чтобы QDockWidget принимал sizeHint кнопки при отстыковке?


Название: QDockWidget - автоматическая подстройка размера
Отправлено: Racheengel от Декабрь 19, 2006, 01:21
а конечным результатом что должно быть?


Название: QDockWidget - автоматическая подстройка размера
Отправлено: QCasper от Декабрь 19, 2006, 01:35
Цитата: "Racheengel"
а конечным результатом что должно быть?


главное окно, отстыкованный доквиджет такого размера как диалог, если разместить на нем кнопку в лэйауте


Название: QDockWidget - автоматическая подстройка размера
Отправлено: Racheengel от Декабрь 19, 2006, 01:41
А в чем проблема то? Зачем sizeHint, если кнопка и так в лэйауте? Что не работает?


Название: QDockWidget - автоматическая подстройка размера
Отправлено: QCasper от Декабрь 19, 2006, 01:58
Цитата: "Racheengel"
А в чем проблема то? Зачем sizeHint, если кнопка и так в лэйауте? Что не работает?


Код:

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent) {
QDockWidget *dw = new QDockWidget("pp", this);
QPushButton *btn = new QPushButton(dw);
dw->setWidget(btn);

addDockWidget(Qt::LeftDockWidgetArea, dw);
}


Соберите и запустите. Теперь отстыкуйте доквиджет, видите какого он размера? Некрасиво да? Кнопка по центру, да еще и так беспонтово растянута, много неиспользованного места. Вот надо чтобы доквиджет принимал размер кнопки.


Название: QDockWidget - автоматическая подстройка размера
Отправлено: Dendy от Декабрь 19, 2006, 06:01
QDockWidget черезчур негибкий и сильно завязан на QMainWindow. В своём проекте я успешно поборол такое растягивание. Но только путём перехвата собьІтий. Собственно, я добился поведения как в 8-й студии. Подсвечивание области докинга, полупрозрачное плавающее окно с произвольньІм размером, приклеивание влево-вправо-вниз-вверх от области с помощью индикатора посередине области приклеивания.

Если интересно - могу вьІложить.


Название: QDockWidget - автоматическая подстройка размера
Отправлено: crocus от Декабрь 19, 2006, 06:52
Конечно интересно!!!

Я еще так делал:
Код:
dock->adjustSize();


Название: QDockWidget - автоматическая подстройка размера
Отправлено: QCasper от Декабрь 19, 2006, 17:00
Опупительно интересно!!

добавлено спустя 5 часов 59 минут:

 
Цитата: "crocus"
Я еще так делал:
Код:
dock->adjustSize();


А можно поинтересоваться, в какой именно момент надо так делать?
Вернее в какой момент то я знаю - в момент отстыковки, как это описать кодом?


Название: QDockWidget - автоматическая подстройка размера
Отправлено: Dendy от Декабрь 19, 2006, 17:18
Вуаля. Только хочу предупредить, что железно работает только в винде. На Маке просто времени не бьІло подправлять код. Там какие-то бока с рисованием рубер-банда. Да и написан весь код на коленке в свободное время, так что не сильно бейте. :)


DockPlacer.h
Код:

#pragma once

#include <QObject>




class QMainWindow;




class DockPlacer : public QObject
{
Q_OBJECT

public:
DockPlacer( QMainWindow * mainWindow );
~DockPlacer();

protected:
void timerEvent( QTimerEvent * e );
bool eventFilter( QObject * o, QEvent * e );

private:
class Private;
Private * d;
};



DockPlacer.cpp
Код:

#include "DockPlacer.h"

#include <QMainWindow>
#include <QDockWidget>
#include <QApplication>
#include <QStyle>
#include <QMouseEvent>
#include <QStylePainter>
#include <QRubberBand>
#include <QStyleOption>
#include <QPointer>
#include <QBasicTimer>

#include "indicator.xpm"




static const int Radius = 18;




class DockPlacer::Private
{
public:
void create_band();
void collect_areas();
void update_area( const QPoint & pos, QDockWidget * dock );
void place_dock( QDockWidget * dock );

public:
QMainWindow * w;
QWidget * band;

QBasicTimer added_timer;
QList< QPointer<QObject> > added_objects;

QImage image_center;
QImage image_dock;

bool pressed;
bool dragging;
QPoint grabbed_pos;
struct Area
{
QDockWidget * dock;
QRect rect;
Qt::DockWidgetArea area;
};
QList<Area> areas;
int current_area;
int current_direction;
};




void DockPlacer::Private::create_band()
{
if ( band )
return;

band = new QWidget( w, Qt::Widget );
if ( image_center.isNull() )
image_center = QImage( IndicatorImage );

band->setAttribute( Qt::WA_TransparentForMouseEvents );
#ifndef Q_WS_WIN
band->setAttribute( Qt::WA_NoSystemBackground );
#endif //Q_WS_WIN
band->setAttribute( Qt::WA_WState_ExplicitShowHide );
band->setVisible( false );
}

void DockPlacer::Private::collect_areas()
{
areas.clear();

Area central_area;
central_area.dock = 0;
central_area.rect = w->centralWidget()->geometry();
central_area.area = Qt::AllDockWidgetAreas;
areas << central_area;

QObjectList ch = w->children();
for ( QListIterator<QObject *> it( ch ); it.hasNext(); )
{
QObject * o = it.next();
QDockWidget * dock = qobject_cast<QDockWidget *>( o );
if ( !dock )
continue;
if ( dock->isFloating() )
continue;
if ( !dock->isVisible() )
continue;
bool found = false;
for ( QListIterator<Area> ait( areas ); ait.hasNext(); )
{
if ( ait.next().rect == dock->geometry() )
{
found = true;
break;
}
}
if ( found )
continue;

Area area;
area.dock = dock;
area.rect = dock->geometry();
area.area = w->dockWidgetArea( dock );
areas << area;
}
}

void DockPlacer::Private::update_area( const QPoint & pos, QDockWidget * dock )
{
int cur_area = -1;
int cur_direction = Qt::NoDockWidgetArea;

for ( int i = 0; i < areas.count(); i++ )
{
const Area & area = areas.at( i );

if ( !area.rect.contains( pos ) )
continue;

cur_area = i;

// block docking to already created areas
if ( !(area.area & dock->allowedAreas()) )
continue;

QPoint center = area.rect.center();
QPoint offset = pos - center;

if ( QRect( -Radius, -Radius, Radius*2, Radius*2 ).contains( offset ) )
cur_direction = Qt::AllDockWidgetAreas;
else if ( QRect( -Radius, -Radius*3, Radius*2, Radius*2 ).contains( offset ) )
cur_direction = Qt::TopDockWidgetArea;
else if ( QRect( -Radius, Radius, Radius*2, Radius*2 ).contains( offset ) )
cur_direction = Qt::BottomDockWidgetArea;
else if ( QRect( -Radius*3, -Radius, Radius*2, Radius*2 ).contains( offset ) )
cur_direction = Qt::LeftDockWidgetArea;
else if ( QRect( Radius, -Radius, Radius*2, Radius*2 ).contains( offset ) )
cur_direction = Qt::RightDockWidgetArea;

// block docking to the central widget
if ( area.area == Qt::AllDockWidgetAreas && cur_direction == Qt::AllDockWidgetAreas )
cur_direction = Qt::NoDockWidgetArea;

// block docking to not allowed direction of the central widget
if ( area.area == Qt::AllDockWidgetAreas && !(cur_direction & dock->allowedAreas()) )
cur_direction = Qt::NoDockWidgetArea;

break;
}

if ( cur_area != current_area || cur_direction != current_direction )
{
current_area = cur_area;
current_direction = cur_direction;
band->update();
}
band->update();
}

void DockPlacer::Private::place_dock( QDockWidget * dock )
{
if ( current_area == -1 || current_direction == Qt::NoDockWidgetArea )
return;

const Area & area = areas.at( current_area );
if ( area.dock == dock )
return;

if ( !area.dock )
{
// this is a central widget
if ( current_direction == Qt::AllDockWidgetAreas )
{
// place dock contents to central widget
}
else
{
dock->setFloating( false );
w->addDockWidget( (Qt::DockWidgetArea)current_direction, dock,
current_direction == Qt::TopDockWidgetArea || current_direction == Qt::BottomDockWidgetArea ?
Qt::Vertical : Qt::Horizontal );
}
}
else
{
dock->setFloating( false );
switch ( current_direction )
{
case Qt::TopDockWidgetArea:
w->splitDockWidget( area.dock, dock, Qt::Vertical );
w->splitDockWidget( dock, area.dock, Qt::Vertical );
break;
case Qt::BottomDockWidgetArea:
w->splitDockWidget( area.dock, dock, Qt::Vertical );
break;
case Qt::LeftDockWidgetArea:
w->splitDockWidget( area.dock, dock, Qt::Horizontal );
w->splitDockWidget( dock, area.dock, Qt::Horizontal );
break;
case Qt::RightDockWidgetArea:
w->splitDockWidget( area.dock, dock, Qt::Horizontal );
break;
case Qt::AllDockWidgetAreas:
w->tabifyDockWidget( area.dock, dock );
}
}
}




DockPlacer::DockPlacer( QMainWindow * main_window ) :
d( new Private )
{
d->w = main_window;
d->w->installEventFilter( this );
d->pressed = false;
d->dragging = false;
d->band = 0;
}

DockPlacer::~DockPlacer()
{
if ( d->band )
delete d->band;
delete d;
}

void DockPlacer::timerEvent( QTimerEvent * e )
{
if ( e->timerId() == d->added_timer.timerId() )
{
d->added_timer.stop();
while ( !d->added_objects.isEmpty() )
{
QDockWidget * dock = qobject_cast<QDockWidget *>( d->added_objects.takeFirst() );
if ( dock )
dock->installEventFilter( this );
}
return;
}
}

bool DockPlacer::eventFilter( QObject * o, QEvent * e )
{
if ( o == d->w && e->type() == QEvent::ChildAdded )
{
QChildEvent * ce = static_cast<QChildEvent *>( e );
d->added_objects << ce->child();
d->added_timer.start( 0, this );
return false;
}

if ( o == d->band )
{
if ( e->type() == QEvent::Show )
{
d->band->raise();
e->accept();
return true;
}

if ( e->type() == QEvent::Paint )
{
QStylePainter p( d->band );

if ( d->current_area != -1 )
{
const Private::Area & area = d->areas.at( d->current_area );

p.drawImage( area.rect.center() - QPoint( d->image_center.width()/2, d->image_center.height()/2 ),
d->image_center );

QRect rc;
switch ( d->current_direction )
{
case Qt::AllDockWidgetAreas:
rc = area.rect;
break;
case Qt::TopDockWidgetArea:
rc = QRect( area.rect.left(), area.rect.top(), area.rect.width(), area.rect.height()/2 );
break;
case Qt::BottomDockWidgetArea:
rc = QRect( area.rect.left(), area.rect.bottom() - area.rect.height()/2, area.rect.width(), area.rect.height()/2 );
break;
case Qt::LeftDockWidgetArea:
rc = QRect( area.rect.left(), area.rect.top(), area.rect.width()/2, area.rect.height() );
break;
case Qt::RightDockWidgetArea:
rc = QRect( area.rect.right() - area.rect.width()/2, area.rect.top(), area.rect.width()/2, area.rect.height() );
break;
}

if ( !rc.isEmpty() )
{
#if 0
QStyleOptionRubberBand opt;
opt.shape = QRubberBand::Rectangle;
opt.rect = rc;
#ifndef Q_WS_MAC
opt.opaque = true;
#else
opt.opaque = d->band->windowFlags() & Qt::ToolTip;
#endif
p.drawControl( QStyle::CE_RubberBand, opt );
#endif

p.save();
QColor highlight = Qt::magenta;
QPen pen( highlight.dark( 120 ) );
#ifdef Q_WS_MAC
pen.setWidth( pen.width() + 2 );
p.setBrush( Qt::NoBrush );
#else
QColor dimHighlight(
qMin( highlight.red()/2 + 110, 255 ),
qMin( highlight.green()/2 + 110, 255 ),
qMin( highlight.blue()/2 + 110, 255 ),
127 );
p.setBrush( dimHighlight );
#endif
p.setPen( pen );
p.drawRect( rc.adjusted( 0, 0, -1, -1 ) );
p.restore();
}
}

p.drawImage( d->band->mapFromGlobal( QCursor::pos() ) - d->grabbed_pos, d->image_dock );

e->accept();
return true;
}

return false;
}

QDockWidget * dock = qobject_cast<QDockWidget *>( o );
if ( dock )
{
switch ( e->type() )
{
case QEvent::MouseButtonPress:
{
QMouseEvent * me = (QMouseEvent *)e;

if ( me->button() != Qt::LeftButton )
return false;

if ( !(dock->features() & QDockWidget::DockWidgetMovable) )
return false;

int fw = dock->isFloating() ? dock->style()->pixelMetric( QStyle::PM_DockWidgetFrameWidth, 0, dock ) : 0;
QRect title = QRect( QPoint( fw, fw ), QSize( dock->width() - fw*2, dock->height() - fw*2 ) );

if ( dock->isFloating() )
{
d->grabbed_pos = me->pos();
}
else
{
d->grabbed_pos = QPoint( dock->width()/2, 5 );
}

if ( me->button() == Qt::LeftButton && title.contains( me->pos() ) )
{
d->pressed = true;
dock->grabMouse();
return true;
}
}
return false;

case QEvent::MouseMove:
{
QMouseEvent * me = (QMouseEvent *)e;

if ( !(me->buttons() & Qt::LeftButton) )
return false;

if ( !d->dragging )
{
if ( !d->pressed )
return false;

if ( dock->isFloating() )
{
dock->hide();
}
else
{
dock->hide();
dock->setFloating( true );
dock->adjustSize();
d->grabbed_pos = QPoint( dock->width()/2, 5 );
}

QImage im = QPixmap::grabWidget( dock ).toImage();
d->image_dock = QImage( im.size(), QImage::Format_ARGB32_Premultiplied );
QPainter p( &d->image_dock );
p.drawImage( QPoint(), im );
p.setBrush( QColor( 0, 0, 0, 100 ) );
p.setCompositionMode( QPainter::CompositionMode_DestinationOut );
p.drawRect( im.rect() );
p.end();

d->w->setUpdatesEnabled( false );

// processing events will update dock layout
QApplication::instance()->processEvents();

// fill d->areas with available areas to dock
d->collect_areas();

// move dock to cursor
dock->move( me->globalPos() - d->grabbed_pos );

if ( !d->band )
{
d->create_band();
d->band->installEventFilter( this );
}

d->current_area = -2;
d->update_area( d->w->mapFromGlobal( me->globalPos() ), dock );

d->band->setGeometry( d->w->rect() );
d->band->show();
d->dragging = true;

d->w->setUpdatesEnabled( true );

e->accept();
}
else
{
d->update_area( d->w->mapFromGlobal( me->globalPos() ), dock );
dock->move( me->globalPos() - d->grabbed_pos );
e->accept();
}
}
return true;

case QEvent::MouseButtonRelease:
{
QMouseEvent * me = (QMouseEvent *)e;

d->pressed = false;
dock->releaseMouse();

if ( !d->dragging )
return false;

d->band->hide();
d->dragging = false;

dock->show();
d->place_dock( dock );

if ( dock->isFloating() )
dock->move( me->globalPos() - d->grabbed_pos );

e->accept();
}
return true;
}
}

return false;
}



indicator.xpm
Код:
/* XPM */
static char * IndicatorImage[]={
"88 88 164 2",
"Qt c None",
".A c #3b4963",
"ai c #3c4a65",
".z c #3e4c66",
"ak c #3e4c67",
"ah c #3f4d68",
".y c #414f6a",
"#c c #4170ca",
"ag c #42506c",
"#b c #4372cb",
".x c #45536c",
"#a c #4574cd",
"af c #46546e",
"#S c #4662bc",
"#Q c #4662bd",
"#R c #4663bd",
".w c #495671",
"## c #4976ce",
"ae c #4a5773",
"#O c #4c4faa",
".U c #4c77ce",
"#P c #4d4fa9",
"#N c #4d4faa",
".v c #4d5b75",
"#. c #4d7ad1",
"ad c #4e5c77",
"aj c #4f3f97",
".T c #4f7ad0",
".9 c #507dd2",
".B c #51409a",
".u c #515e79",
"#0 c #52419b",
".V c #52419c",
"ac c #52607b",
".S c #547ed3",
".8 c #5580d5",
".t c #56637e",
"ab c #576580",
".R c #5882d5",
".7 c #5a84d7",
".s c #5b6883",
"aa c #5c6a85",
".6 c #5d88d9",
".Q c #5e87d8",
".r c #5f6c88",
"a# c #616e8a",
".5 c #628bdb",
".q c #63718c",
"ao c #656b96",
"ap c #656b97",
"a. c #65738e",
".P c #658cdc",
".4 c #668fde",
"at c #676d95",
".p c #677591",
"#9 c #697793",
".o c #6b7a95",
".3 c #6b93e0",
".O c #6c93df",
"#8 c #6d7c97",
".2 c #6e96e2",
".n c #6f7d9a",
"#7 c #717f9c",
".1 c #7299e4",
".m c #73819d",
".N c #7398e3",
"am c #74819d",
"#6 c #75839f",
".0 c #759ce5",
".l c #7684a0",
".j c #7685a0",
"aB c #777ba3",
".Z c #779de7",
"al c #7885a2",
"#5 c #7886a3",
".k c #7887a2",
".M c #799ee7",
"aA c #7a7ea5",
"#4 c #7a89a5",
".Y c #7a9fe8",
"ar c #7b7fa6",
".L c #80a5eb",
"ax c #8186a5",
"aw c #868ba9",
"ay c #878ca9",
".K c #87aaef",
"aF c #888ca9",
"aE c #888daa",
".J c #8db0f2",
".I c #93b5f5",
".H c #99b9f7",
".G c #9dbdfb",
"aC c #a0a3ba",
".F c #a0c0fc",
"az c #a3a6bd",
"au c #a7aac1",
"aD c #a8a8a8",
"av c #b1b3ca",
"aq c #b4c8e1",
"an c #b4c9e1",
".# c #b5b5b5",
"#f c #b6cbe2",
"#g c #b7cbe2",
"#e c #b7cbe3",
"#h c #b7cce3",
"#k c #bbcee4",
"#i c #bbcee5",
"#m c #bbcfe4",
"#l c #bbcfe5",
"#j c #bccee5",
"aG c #bdbdbd",
".W c #c0c0c0",
"#o c #c0d2e7",
"#p c #c0d2e8",
"#r c #c0d3e7",
"#q c #c1d2e7",
"#n c #c1d2e8",
".a c #c3c3c3",
"#V c #c4c4c4",
".b c #c5c5c5",
"#t c #c5d6ea",
"#u c #c5d7ea",
".c c #c6c6c6",
"#s c #c6d6ea",
"#v c #c6d7ea",
"#Z c #c8c8c8",
".d c #c9c9c9",
"#z c #cbdaec",
"#x c #cbdaed",
"#y c #cbdbec",
"#w c #cbdbed",
".e c #cccccc",
".f c #cecece",
"#T c #cfcfcf",
"#F c #cfdeef",
"#D c #cfdfef",
"aH c #d0d0d0",
"#B c #d0deef",
"#E c #d0def0",
"#A c #d0dfef",
"#C c #d0dff0",
".g c #d1d1d1",
"#W c #d2d2d2",
"#d c #d4d4d4",
"#I c #d4e1f1",
"#H c #d4e1f2",
"#G c #d4e2f1",
"#K c #d4e2f2",
".C c #d5d5d5",
"#J c #d5e2f1",
".h c #d7d7d7",
"#L c #d7e4f3",
".i c #d8d8d8",
"#U c #d9d9d9",
".D c #dcdcdc",
"#3 c #dedede",
"#Y c #dfdfdf",
".E c #e0e0e0",
"#X c #e1e1e1",
"#2 c #e2e2e2",
"#1 c #e3e3e3",
".X c #e4e4e4",
"as c #e5e6ee",
"#M c #ffffff",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.a.b.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.c.d.e.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.b.d.g.h.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.e.h.j.k.l.m.n.o.p.q.r.s.t.u.v.w.v.w.x.y.z.A.B.C.D.E.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B.F.F.G.H.I.J.K.L.M.N.O.P.Q.P.Q.R.S.T.U.V.W.i.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B.Y.Z.0.1.2.3.4.5.6.7.8.9#..9#.###a#b#c.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#e#e#f#g#g#g#e#e#g#e#h#e#g#g#g#e#g#g#e.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#i#i#j#i#k#l#i#k#l#l#k#i#k#k#m#l#j#i#k.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#n#o#p#o#o#o#o#q#o#o#r#o#o#p#o#r#o#q#o.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#s#t#u#t#t#v#u#s#s#u#t#t#t#t#t#u#u#u#s.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#w#w#x#x#w#w#x#w#y#z#z#w#w#w#x#w#w#w#x.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#A#B#B#C#B#B#B#B#D#C#B#E#A#A#A#F#F#A#A.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#G#H#I#H#J#H#K#G#G#K#G#K#K#G#H#I#G#K#G.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M.V#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M.V.V.V#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#N#N#N#O#P#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#Q#R#S#S#S#S#Q#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.a.c#T#U.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.E.D.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a#V#V.d#W.D.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X#X#Y.h.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a#V#Z#Z#T.h#Y#0#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X#1#2#3.h.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a#V#Z#T#T.h#3#2.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.##d.X.X.X#2#3.h.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a#V#Z#T.h.h#3#2.X.i.W.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.W.i.X.X.X.X#2#3.h.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.a#V#Z#T.h#3#2.X.X.E.i#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d.i.E.X.X.X.X.X#2#3.h.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#",
".#.a.a.b.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.d#T.h#3#2.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X#2#3.h#T.d.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.#",
".#.a.c.d.e.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f#T#W.h#3#2.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X#2#3.h#W#T.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.#",
".#.b.d.g.h.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i#U.D#Y#2.X.X.X.X.V#4#4#5#5#6#7#8#9a.a#aaabacadaeadaeafagahai.V.i.E.X.X.X.X.X.X.X#2#Y.D#U.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#",
".#.c.e.haj.k.k.l.k.l.m.n.o.p.q.r.s.t.u.v.w.v.w.x.yakai.V.i.E.X.X.V.G.H.F.F.G.H.I.J.K.L.M.N.O.P.Q.P.Q.R.S.T.U.V.W.i.X.X.X.V#4#4#5#4alam.n.o.p.q.r.s.t.u.v.w.v.w.x.y.z.A.B.C.D.E.#",
".#.c.f.i.B.G.H.F.H.F.G.H.I.J.K.L.M.N.O.P.Q.P.Q.R.S.T.U.V.W.i.X.X.V.0.1.Z.Z.0.1.2.3.4.5.6.7.8.9#..9#.###a#b#c.V.##d.X.X.X.V.G.H.F.H.F.G.H.I.J.K.L.M.N.O.P.Q.P.Q.R.S.T.U.V.W.i.X.#",
".#.c.f.i.B.0.1.Z.1.Z.0.1.2.3.4.5.6.7.8.9#..9#.###a#b#c.V.##d.X.X.V#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.X.V.0.1.Z.1.Z.0.1.2.3.4.5.6.7.8.9#..9#.###a#b#c.V.##d.X.#",
".#.c.f.i.Banan#g#j#o#u#w#F#G#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M#Lao#Lap#L.V#L.V#L.V#L.V#L.V#Lap#Lao#L#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#I#B#x#u#p#j#fanan.V.##d.X.#",
".#.c.f.i.Banan#e#l#r#u#w#F#I#L.V#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#Mao#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lao#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M.V#L#H#C#x#t#o#i#ganan.V.##d.X.#",
".#.c.f.i.Banan#g#m#o#t#x#A#H#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#J#B#w#t#o#k#gaqan.V.##d.X.#",
".#.c.f.i.Banan#g#k#p#t#w#A#G#L.V#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M.V#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L.V#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M.V#L#H#B#w#v#o#l#ganan.V.##d.X.#",
".#.c.f.i.Banan#g#k#o#t#w#A#K#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#K#B#x#u#o#i#eanaq.V.##d.X.#",
".#.c.f.i.Baqan#e#i#o#t#w#E#K#L.V#M#M#M#M#M#M#Q#M#M#M#M.V.##d.X.X.V#M.V#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L.V#M.V.##d.X.X.X.V#M#M#M#M#Q#M#M#M#M#M#M.V#L#G#B#w#s#q#k#eanan.V.##d.X.#",
".#.c.f.i.Banaq#h#k#r#t#z#B#G#L#L#M#M#M#M#M#P#S#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#M.V.##d.X.X.X.V#M#M#M#M#R#N#M#M#M#M#M#L#L#G#D#y#s#o#l#ganan.V.##d.X.#",
".#.c.f.i.Banan#e#l#o#u#z#C#K#L.V#M#M#M#M.V#O#S#M#M#M#M.V.##d.X.X.V#Map#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lap#M.V.##d.X.X.X.V#M#M#M#M#S#N.V#M#M#M#M.V#L#K#C#z#u#o#l#eanan.V.##d.X.#",
".#.c.f.i.Banan#g#l#o#s#y#D#G#L#L#M#M#M.V.V#N#S#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#M.V.##d.X.X.X.V#M#M#M#M#S#N.V.V#M#M#M#L#L#G#B#z#t#r#k#haqan.V.##d.X.#",
".#.c.f.i.Banan#e#k#q#s#w#B#G#L.V#M#M#M#M.V#N#S#M#M#M#M.V.##d.X.X.V#M.V#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L.V#M.V.##d.X.X.X.V#M#M#M#M#S#O.V#M#M#M#M.V#L#K#E#w#t#o#i#eanaq.V.##d.X.#",
".#.c.f.i.Baqan#e#i#o#u#x#B#K#L#L#M#M#M#M#M#N#R#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#M.V.##d.X.X.X.V#M#M#M#M#S#P#M#M#M#M#M#L#L#K#A#w#t#o#k#ganan.V.##d.X.#",
".#.c.f.i.Banan#g#l#o#v#w#B#H#L.V#M#M#M#M#M#M#Q#M#M#M#M.V.##d.X.X.V#M.V#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lao#M.V.##d.X.X.X.V#M#M#M#M#Q#M#M#M#M#M#M.V#L#G#A#w#t#p#k#ganan.V.##d.X.#",
".#.c.f.i.Banaq#g#k#o#t#w#B#J#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L.V#L.V#L.V#L.V#Lap#Lao#M#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#H#A#x#t#o#m#ganan.V.##d.X.#",
".#.c.f.i.Banan#g#i#o#t#x#C#H#L.V#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#Map#L#L#L#L#Lap#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M.V#L#I#F#w#u#r#l#eanan.V.##d.X.#",
".#.c.f.i.Banan#f#j#p#u#x#B#I#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#M#L#L#L#L#L#L#L#M.V.V.V.V.V.V.V.V.V.V.V.V.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#G#F#w#u#o#j#ganan.V.##d.X.#",
".#.c.f.i.Banan#e#i#o#t#w#B#H#L.V#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.V#Mao#L#L#L#L#Lao#M.V#M#M#M#M#M.V#M#M#M#M#M.V.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M.V#L#K#A#w#u#q#i#ganan.V.##d.X.#",
".#.c.f.i.Banan#e#i#n#s#w#A#G#L#L#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.Xaras#Mao#Lao#Lao#Masatas.b.#.basatas.b.#.basat.##d.X.X.X.V#M#M#M#M#M#M#M#M#M#M#M#L#L#G#A#x#s#o#k#eanan.V.##d.X.#",
".#.c.f.i.B.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.##d.X.Xauavas#M#M#M#M#Masavawavas#Masavaxavas#Masavay.##d.X.X.X.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.##d.X.#",
".#.c.f.i.C.W.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.W.i.X.X.iazaA.V.V.V.V.VaBaCaDaEat.VataFaDaFat.VatayaDaG.i.X.X.X.i.W.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.W.i.X.#",
".#.c.f.i.D.i#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d.i.E.X.X.EaHaG.#.#.#.#.#.#.#aG.baG.#.#.#aG.baG.#.#.#aGaH.E.X.X.X.E.i#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d.i.E.X.#",
".#.c.f.i.E.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.E.i#d#d#d#d#d#d#d.i.D.i#d#d#d.i.D.i#d#d#d.i.E.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#",
".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.E#X#1.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.D#Y#2.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.X.X.X.X#4#4#5#6#7#8#9a.a#aaabacadaeadaeafagahai.V.i.E.X.X.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.X.X.X.V.F.F.G.H.I.J.K.L.M.N.O.P.Q.P.Q.R.S.T.U.V.W.i.X.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.X.X.V.Y.Z.0.1.2.3.4.5.6.7.8.9#..9#.###a#b#c.V.##d.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.X.V#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.h#3#2.V#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##T.h#Y#0#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.d#W.D.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c#T#U.B#M#M#M#M#M#M#Q#S#S#S#S#R#Q#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#P#O#N#N#N#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M.V.V.V#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M.V#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V#L.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#A#A#F#F#A#A#A#E#B#C#D#B#B#B#B#C#B#B#A.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#A#A#F#F#A#A#A#E#B#C#D#B#B#B#B#C#B#B#A.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#x#w#w#w#x#w#w#w#z#z#y#w#x#w#w#x#x#w#w.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#s#u#u#u#t#t#t#t#t#u#s#s#u#v#t#t#u#t#s.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#o#q#o#r#o#p#o#o#r#o#o#q#o#o#o#o#p#o#n.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#k#i#j#l#m#k#k#i#k#l#l#k#i#l#k#i#j#i#i.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B#e#g#g#e#g#g#g#e#h#e#g#e#e#g#g#g#f#e#e.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.Bananananananananaqanananananaqanananan.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.Banananananananaqananananaqanananananan.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.B.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.##d.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.C.W.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.W.i.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.D.i#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d.i.E.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.c.f.i.E.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"};




Как юзать.
Берём любой пример из Qt, например qtdir/examples/mainwindows/dockwidgets. И добавляем в конструктор MainWindow в самом начале одну строчку:

Код:
new DockPlacer( this );


Компилим. Запускаем. Тягаем.

добавлено спустя 2 минуты:

 P.S. Заметьте какое чувство юмора у Троллей! :D  НевидимьІе пиксельІ в картинке в виде символов Qt.


Название: QDockWidget - автоматическая подстройка размера
Отправлено: QCasper от Декабрь 19, 2006, 22:43
Попытался скомпилить dockplacer.cpp и сразу аццкая прорва ошибок.

Цитировать
In file included from D:/Qt/4.1.3/include/QtGui/qwindowdefs.h:1,
                 from D:/Qt/4.1.3/include/QtGui/../../src/gui/kernel/qwidget.h:2
7,
                 from D:/Qt/4.1.3/include/QtGui/qwidget.h:1,
                 from D:/Qt/4.1.3/include/QtGui/../../src/gui/widgets/qmainwindo
w.h:27,
                 from D:/Qt/4.1.3/include/QtGui/qmainwindow.h:1,
                 from D:/Qt/4.1.3/include/QtGui/QMainWindow:1,
                 from dockplacer.cpp:3:
D:/Qt/4.1.3/include/QtGui/../../src/gui/kernel/qwindowdefs.h:32: error: `QtValid
LicenseForGuiModule' does not name a type
In file included from dockplacer.cpp:14:
indicator.xpm:255:181: warning: no newline at end of file
dockplacer.cpp: In member function `void DockPlacer::Private::update_area(const
QPoint&, QDockWidget*)':
dockplacer.cpp:113: error: `NoDockWidgetArea' is not a member of `Qt'
dockplacer.cpp:144: error: `NoDockWidgetArea' is not a member of `Qt'
dockplacer.cpp:148: error: `NoDockWidgetArea' is not a member of `Qt'
dockplacer.cpp: In member function `void DockPlacer::Private::place_dock(QDockWi
dget*)':
dockplacer.cpp:164: error: `NoDockWidgetArea' is not a member of `Qt'
dockplacer.cpp:206: error: 'class QMainWindow' has no member named 'tabifyDockWi
dget'


Название: QDockWidget - автоматическая подстройка размера
Отправлено: Dendy от Декабрь 20, 2006, 01:40
Ну на счёт первого: QtValidLicenseForGuiModule - ето к лицензионности, параметрам сборки. Такое ощущение, что у Вас сборка от Console Edition. Удивительно и странно как вообще что-то Гуёвое работает.

А на счёт второго. Кхм.. забьІл добавить :)  Qt 4.2 минимум.


Название: QDockWidget - автоматическая подстройка размера
Отправлено: crocus от Декабрь 20, 2006, 02:14
При создании dock в конец функции дописал:
Код:

......................
connect(dock, SIGNAL (topLevelChanged (bool)), this, SLOT (restoreSize(bool)));

и если dock становится float вызывается функция
Код:
void MainWindow::restoreSize(bool flot)
{
if(flot)
{
dock->adjustSize();
} else {
return;
}
}

Да,-- и еще политики для виджета, помещаемого в dock ставятся:
Код:
QSizePolicy::Maximum

- иначе на 4.1.2 не работало.