Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jurtal от Март 01, 2010, 16:25



Название: Масштабирование фоновой картинки формы
Отправлено: jurtal от Март 01, 2010, 16:25
Динамически на форме размещаю кнопки. (Количество их м.б. разным).
Фоном формы должен быть png (он прост - серый квадрат с закругленными краями). Т.к. размер формы с кнопочками каждый раз разный, то после размещения кнопок накладываю отмасштабированную маску. Вот так

QPixmap backgroundRegion = pixmap.scaled(e->size(), Qt::IgnoreAspectRatio, Qt::FastTransformation);
setMask(backgroundRegion.mask());

Получаются кнопки на серой подложке с закругленными краями.
Проблема в том, что тормозит перерисовка из-за масштабирования.

Если у кого есть идеи как оптимизировать, пожалуйста поделитесь...


Название: Re: Масштабирование фоновой картинки формы
Отправлено: BRE от Март 01, 2010, 16:31
Ты картинку в paintEvent все время масштабируешь? Каждую перерисовку?


Название: Re: Масштабирование фоновой картинки формы
Отправлено: jurtal от Март 01, 2010, 16:41
Да, в PaintEvent Каждую перерисовку.


Название: Re: Масштабирование фоновой картинки формы
Отправлено: BRE от Март 01, 2010, 17:00
Да, в PaintEvent Каждую перерисовку.
Ну не делай так. Это не быстро.  :)


Название: Re: Масштабирование фоновой картинки формы
Отправлено: jurtal от Март 01, 2010, 17:05
Даже один раз масштабировать png долго... Так что просто делать ЭТО редко не поможет... Нужен алгоритм похитрее.


Название: Re: Масштабирование фоновой картинки формы
Отправлено: BRE от Март 01, 2010, 17:12
Даже один раз масштабировать png долго... Так что просто делать ЭТО редко не поможет... Нужен алгоритм похитрее.
Если это одноцветная картинка, то лучше делать заливку и рисовать скругленные углы.
Если хочется масштабировать, то картинку лучше один раз загрузить в QPixmap и при изменении размеров виджета в обработчике QResizeEvent ее масштабировать. Дальше в paintEvent выводить уже отмасштабированную.


Название: Re: Масштабирование фоновой картинки формы
Отправлено: jurtal от Март 01, 2010, 17:21
В resize один раз масштабировать уже попробовал... Долго тоже получилось. Можешь пояснить как углы обезать?


Название: Re: Масштабирование фоновой картинки формы
Отправлено: break от Март 02, 2010, 01:41
можно попробовать через ProxyWdiget в QGraphicsView

есть такой класс вьюва

Код
C++ (Qt)
#ifndef __RESIZEGVIEW_H__
#define __RESIZEGVIEW_H__
 
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsProxyWidget>
#include <QTimer>
 
class CResizeGView : public QGraphicsView
{
Q_OBJECT;
QWidget * m_pWidget;
QTimer    m_tmDoResize;
 
public:
CResizeGView( QGraphicsScene * pScene ) : QGraphicsView( pScene )
{
m_pWidget = 0;
m_tmDoResize.setSingleShot( true );
m_tmDoResize.setInterval( 500 );
QObject::connect( &m_tmDoResize, SIGNAL(timeout()), this, SLOT(doResize()) );
}
void setWidget( QWidget * pWidget )
{
m_pWidget = pWidget;
}
 
private:
virtual void resizeEvent ( QResizeEvent * pEvent )
{
m_tmDoResize.start();
}
 
private slots:
void doResize()
{
double fdW = (double)( size().width()-10 ) / (double)(m_pWidget->size().width());
double fdH = (double)( size().height()-10 ) / (double)(m_pWidget->size().height());
resetTransform();
scale( fdW, fdH );
}
};
 
#endif // __RESIZEGVIEW_H__
 

использовать со своей формой надо так:

Код
C++ (Qt)
QGraphicsScene * pScene = new QGraphicsScene();
pScene->addWidget( pWidget );
CResizeGView * pView = new CResizeGView( pScene );
pView->setGeometry( pWidget->geometry() );
pView->setWidget( pWidget );
 
pView->show();
 

у меня ресайзит и вроде достаточно быстро - этот сопсоб хорош тем что он годен для ресайза абсолютно любого виджета в том числе не предназначенного для ресайза совсем