Название: 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 выставить?? Хотя и политика должна помогать...
|