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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Задание размера виджета в статус баре.  (Прочитано 7311 раз)
alexman
Гость
« : Июль 13, 2009, 17:16 »

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

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

P.S. если установить w->setMinimumSize( a, b ), то это работает, но затем нельзя изменить размеры окна меньше (a,b), что не нужно.
« Последнее редактирование: Июль 13, 2009, 17:27 от alexman » Записан
BRE
Гость
« Ответ #1 : Июль 13, 2009, 17:27 »

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

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

P.S. не нужно советовать установить w->setMinimumSize( a, b ).
А show ему делал?
Записан
f-r-o-s-t
Гость
« Ответ #2 : Июль 13, 2009, 17:28 »

Код можно =)
Записан
alexman
Гость
« Ответ #3 : Июль 13, 2009, 17:30 »

show() не помогает!
Записан
alexman
Гость
« Ответ #4 : Июль 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 );
}
};
Записан
spectre71
Гость
« Ответ #5 : Июль 14, 2009, 09:58 »

Зачем ты создаешь новый QStatusBar? Не проще использовать уже существующий statusBar()!

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

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

Может  тебе это нужно?
w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
Записан
alexman
Гость
« Ответ #6 : Июль 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.
Записан
alexman
Гость
« Ответ #7 : Июль 14, 2009, 10:45 »

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

Кстати w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)) тоже пойдет. Но если хотим чтобы виджет не растягивался больше определенного значения (так часто требуется), то нужно в ручную определять setMaxumumSize для виджета. Лучше использовать параметр stretch Улыбающийся
w->setMaximumWidth ( int maxw )
stretch - если необходимо поддерживать определенные пропорции нескольких виджетов на уровне Layout.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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