Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vassili от Июль 25, 2005, 18:34



Название: QT4 и QGridLayout
Отправлено: Vassili от Июль 25, 2005, 18:34
Добрый день!
У меня забавная проблемма с QGridLayout в QT4. Я создаю обычный виджет с помощью wgt = new QWidget(), куда добавляю QGridlLayout* lt = new QGridLayout( wgt ). Потом последовательно создаю несколько виджетов wgtk = new QWidget( wgt ), для них гржу картинку и делаю следующие действия:
QString bgimg( "path" );
QPixmap pix;
if( !bgimg.isNull() ) {
pix = QPixmap( bgimg );
if( !pix.isNull() ) {
QBitmap msk = pix.mask();
pix.setMask( msk );
QPalette palette;
palette.setBrush( wgt->backgroundRole(), QBrush( pix ) );
wgtk->setPalette( palette );
wgtk->resize( pix.width(), pix.height() );
}
}

Потом засовываю wgtk в QGridLayout:
parent_layout->addWidget( wgtk, 0, 0, 1, 1 );

Результирующее поведение - очень странное: всунутый виджет всегда принимает минимальный размер. ( по горизонтали - minimumWidth(), по вертикали - соответственно ). В силу ряда причин мне это очень не удобно, я бы хотел чтобы виджет ресайзился в соответствии с текущим размером родительского виджета. Плюс ко сему - у меня в QGridLayout всегда зазор между ячейками в несколько пикселов и никак его не убрать, а надо. SetMargin SetSpacing не помогают. Кто -нибудь знает как с этим бороться?


Название: QT4 и QGridLayout
Отправлено: L.Marvell от Июль 25, 2005, 19:53
Я не уверен, но может поставить wgtk центральным виджетом?
Код:
setCentralWidget(wgtk);


Название: QT4 и QGridLayout
Отправлено: Vassili от Июль 26, 2005, 10:45
Это в примере только одна wgtk, а в действительности их - десяток. Плюс ко всему - centralWidget - это их родитель. Сегодня буду собирать простой прототип на премет поиграться с layout. Результат отпишу.


Название: QT4 и QGridLayout
Отправлено: Vassili от Июль 26, 2005, 14:18
немного повозился с прототипом, нашел- таки закономерность. Ниже - код прототипа:

#include <QApplication>
#include <QWorkspace>
#include <QPalette>
#include <QGridLayout>
#include <QBrush>
#include <QPixmap>
#include <QDir>
#include <QRegExp>
#include <QSizePolicy>
#include <QPixmap>
#include <QBitmap>
#include <QRect>
#include <QSizePolicy>
#include <QPainter>
#include <QWidget>

const char* files[] = { "frame_top_left.png", "frame_top.png", "frame_top_right.png" };

int main( int argc, char ** argv )
{

  QApplication app( argc, argv );
  QWorkspace mwd;
  mwd.resize( 700, 500 );
  mwd.show();
  QWidget *wgt;
  wgt = new QWidget( &mwd );
  mwd.addWindow( wgt );
  wgt->resize( 500, 400 );
  wgt->show();
  QGridLayout *grlt = new QGridLayout( wgt );
  grlt->setSpacing( 0 );
  grlt->setMargin( 0 );
  for( int i= 0; i < 3; i++ ) {
   QWidget* wgtk = new QWidget();
   QString bgimg( files[ i ] );
   QPixmap pix( bgimg );
   if( !pix.isNull() ) {
   QBitmap msk = pix.mask();
   pix.setMask( msk );
   QPalette palette;
   palette.setBrush( wgt->backgroundRole(), QBrush(  QColor( 255/( i+1 ), 255/( i+1 ),  255/( i+1 ) ), pix ) );
   wgtk->setPalette( palette );
   wgtk->resize( pix.width(), pix.height() );
  }
   grlt->addWidget( wgtk, 0, i, 1, 1 );
   //grlt->addWidget( wgtk, 0, i, 1, 1, grlt->addWidget( wgtk, 0, i, 1, 1, Qt::AlignCenter ); );
   wgtk->updateGeometry();
   wgtk->show();
  }
  return app.exec();
}

Как заатачить картинки не знаю но они - простые файлы в формате png. Наверное можно взять любые. В том виде как сейчас прототип работает правильно. Но если сторку grlt->addWidget( wgtk, 0, i, 1, 1 ); закоментировать и откоментировать следующую за ней - получается поведение описаное выше. И так - со всеми аллайнментами. У меня ни с одним так и не заработало. Есть у кого какие идеи?[/img]


Название: QT4 и QGridLayout
Отправлено: Racheengel от Июль 26, 2005, 16:46
а если для виджета поставить политику размеров Fixed ?


Название: QT4 и QGridLayout
Отправлено: Vassili от Июль 26, 2005, 17:22
Изменение политики resizePolicy для виджета никак не влияет, я их все перепробовал. не только fixed. Документация по политике какая- ьо невнятная - с одной стороны написано что политика - для детей виджета:- "If there is a QLayout that manages this widget's children, the size policy specified by that layout is used. If there is no such QLayout, the result of this function is used" А если есть лэйаут, то его политика используется. Однако в самом лэйауте никаких методов для управления политиками нет. Да вроде бы и сама политика не для детей, а для самого виджета.
В любом случае это не помогает и лэйаут обязян правильно реагировать на эллайнмент, однако не реагирует!


Название: QT4 и QGridLayout
Отправлено: Racheengel от Июль 26, 2005, 17:31
хм... ну хз... мож баг? :)


Название: Re: QT4 и QGridLayout
Отправлено: Danila_Bagrofff от Май 28, 2009, 10:56
а setMinimumSize выставить?? Хотя и политика должна помогать...