Russian Qt Forum
Сентябрь 30, 2024, 12:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT4 и QGridLayout  (Прочитано 8967 раз)
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 не помогают. Кто -нибудь знает как с этим бороться?
Записан
L.Marvell
Гость
« Ответ #1 : Июль 25, 2005, 19:53 »

Я не уверен, но может поставить wgtk центральным виджетом?
Код:
setCentralWidget(wgtk);
Записан
Vassili
Гость
« Ответ #2 : Июль 26, 2005, 10:45 »

Это в примере только одна wgtk, а в действительности их - десяток. Плюс ко всему - centralWidget - это их родитель. Сегодня буду собирать простой прототип на премет поиграться с layout. Результат отпишу.
Записан
Vassili
Гость
« Ответ #3 : Июль 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]
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Июль 26, 2005, 16:46 »

а если для виджета поставить политику размеров Fixed ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vassili
Гость
« Ответ #5 : Июль 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" А если есть лэйаут, то его политика используется. Однако в самом лэйауте никаких методов для управления политиками нет. Да вроде бы и сама политика не для детей, а для самого виджета.
В любом случае это не помогает и лэйаут обязян правильно реагировать на эллайнмент, однако не реагирует!
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Июль 26, 2005, 17:31 »

хм... ну хз... мож баг? Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Danila_Bagrofff
Гость
« Ответ #7 : Май 28, 2009, 10:56 »

а setMinimumSize выставить?? Хотя и политика должна помогать...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 20.