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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Масштабирование фоновой картинки формы  (Прочитано 5365 раз)
jurtal
Гость
« : Март 01, 2010, 16:25 »

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

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

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

Если у кого есть идеи как оптимизировать, пожалуйста поделитесь...
Записан
BRE
Гость
« Ответ #1 : Март 01, 2010, 16:31 »

Ты картинку в paintEvent все время масштабируешь? Каждую перерисовку?
Записан
jurtal
Гость
« Ответ #2 : Март 01, 2010, 16:41 »

Да, в PaintEvent Каждую перерисовку.
Записан
BRE
Гость
« Ответ #3 : Март 01, 2010, 17:00 »

Да, в PaintEvent Каждую перерисовку.
Ну не делай так. Это не быстро.  Улыбающийся
Записан
jurtal
Гость
« Ответ #4 : Март 01, 2010, 17:05 »

Даже один раз масштабировать png долго... Так что просто делать ЭТО редко не поможет... Нужен алгоритм похитрее.
Записан
BRE
Гость
« Ответ #5 : Март 01, 2010, 17:12 »

Даже один раз масштабировать png долго... Так что просто делать ЭТО редко не поможет... Нужен алгоритм похитрее.
Если это одноцветная картинка, то лучше делать заливку и рисовать скругленные углы.
Если хочется масштабировать, то картинку лучше один раз загрузить в QPixmap и при изменении размеров виджета в обработчике QResizeEvent ее масштабировать. Дальше в paintEvent выводить уже отмасштабированную.
Записан
jurtal
Гость
« Ответ #6 : Март 01, 2010, 17:21 »

В resize один раз масштабировать уже попробовал... Долго тоже получилось. Можешь пояснить как углы обезать?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Март 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();
 

у меня ресайзит и вроде достаточно быстро - этот сопсоб хорош тем что он годен для ресайза абсолютно любого виджета в том числе не предназначенного для ресайза совсем
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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