Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexman от Июль 13, 2009, 17:16



Название: Задание размера виджета в статус баре.
Отправлено: alexman от Июль 13, 2009, 17:16
Делаю следующее: добавляю в статус бар виджет (QWidget* w), делаю ему resize(a,b), update (рисую в него pixmap). Функция w->width() возвращает a. Но реально на экране виджет не визуализируется.

В чем проблема? Заранее благодарю за подсказки!

P.S. если установить w->setMinimumSize( a, b ), то это работает, но затем нельзя изменить размеры окна меньше (a,b), что не нужно.


Название: Re: Задание размера виджета в статус баре.
Отправлено: BRE от Июль 13, 2009, 17:27
Делаю следующее: добавляю в статус бар виджет (QWidget* w), делаю ему resize(a,b), update (рисую в него pixmap). Функция w->width() возвращает a. Но реально на экране виджет не визуализируется.

В чем проблема? Заранее благодарю за подсказки!

P.S. не нужно советовать установить w->setMinimumSize( a, b ).
А show ему делал?


Название: Re: Задание размера виджета в статус баре.
Отправлено: f-r-o-s-t от Июль 13, 2009, 17:28
Код можно =)


Название: Re: Задание размера виджета в статус баре.
Отправлено: alexman от Июль 13, 2009, 17:30
show() не помогает!


Название: Re: Задание размера виджета в статус баре.
Отправлено: alexman от Июль 14, 2009, 08:06
Код можно =)

Вот код! Только я здесь не pixmap рисую, а текст. Но проблема остается!

Код:
#include <QMainWindow>
#include <QApplication>
#include <QPainter>
#include <QStatusBar>
#include <QEvent>
#include <QHBoxLayout>
#include <QWidget>

class ScrollLabel2 : public QWidget
{
Q_OBJECT

public:
ScrollLabel2( QWidget* parent = 0 ) : QWidget( parent )
{
w = new QWidget( this );
//w->setMinimumSize( 300, w->minimumHeight() );//Так работает, но затем окно невозможно сжать по ширине!
w->resize( 300, w->minimumHeight() );//Так даже ничего не рисуется!
w->installEventFilter( this );

QHBoxLayout* layout = new QHBoxLayout;
layout->setMargin( 0 );
layout->setSpacing( 0 );

layout->addWidget( w );//На самом деле здесь добавляется больше виджетов!

setLayout( layout );
}

protected:
bool eventFilter( QObject* o, QEvent* e )
{
if ( o == w && e->type() == QEvent::Paint ) {
QPainter painter( w );
painter.setPen( Qt::black );
painter.setFont( qApp->font() );
painter.drawText( rect(), Qt::AlignCenter, "Hello!" );

return true;
}

return QWidget::eventFilter( o, e );
}

QWidget* w;
};

class MainWindow2 : public QMainWindow
{
Q_OBJECT

public:
MainWindow2( QWidget* parent = 0, Qt::WindowFlags flags = 0 )
: QMainWindow( parent, flags )
{
ScrollLabel2* scrollLabel = new ScrollLabel2( this );

QStatusBar* statusBar = new QStatusBar;
statusBar->addWidget( scrollLabel, 0, true );

setStatusBar( statusBar );
}
};


Название: Re: Задание размера виджета в статус баре.
Отправлено: spectre71 от Июль 14, 2009, 09:58
Зачем ты создаешь новый QStatusBar? Не проще использовать уже существующий statusBar()!

w->resize( 300, w->minimumHeight() );//Так даже ничего не рисуется!
И не будет - minimumHeight  у тебя == 0;

Не понятно чего ты хочешь вообще добиться выставлением размеров, опиши задачу!

Может  тебе это нужно?
w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));


Название: Re: Задание размера виджета в статус баре.
Отправлено: alexman от Июль 14, 2009, 10:41
Зачем ты создаешь новый QStatusBar? Не проще использовать уже существующий statusBar()!

w->resize( 300, w->minimumHeight() );//Так даже ничего не рисуется!
И не будет - minimumHeight  у тебя == 0;

Не понятно чего ты хочешь вообще добиться выставлением размеров, опиши задачу!

Может  тебе это нужно?
w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));


Проблема решена: я использовал addWidget с пораметром stretch == 0, а stretch есть доля занимаемого места по ширине на статус баре. То есть если установить stretch > 0, то status bar сам будет растягивать виджет, исходя из stretch.


Название: Re: Задание размера виджета в статус баре.
Отправлено: alexman от Июль 14, 2009, 10:45
Кстати w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)) тоже пойдет. Но если хотим чтобы виджет не растягивался больше определенного значения (так часто требуется), то нужно в ручную определять setMaxumumSize для виджета. Лучше использовать параметр stretch :)


Название: Re: Задание размера виджета в статус баре.
Отправлено: spectre71 от Июль 14, 2009, 10:54
Кстати w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)) тоже пойдет. Но если хотим чтобы виджет не растягивался больше определенного значения (так часто требуется), то нужно в ручную определять setMaxumumSize для виджета. Лучше использовать параметр stretch :)
w->setMaximumWidth ( int maxw )
stretch - если необходимо поддерживать определенные пропорции нескольких виджетов на уровне Layout.