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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QWidget и фон!  (Прочитано 21859 раз)
daenux
Гость
« : Октябрь 27, 2010, 20:48 »

Здравствуйте господа форумчане!

Создаю небольшое проект в Qt, основной класс графического интерфейса наследуеться от QWidget, вопросы:

1. Стоит ли наследоваться от QWidget, может лучше например от QFrame на будующее так сказать...
2. Какого типа изоброжение подходит для того что бы выресовывать ее на QWidget (допустим) - как фон? (например, одно из условий: что бы не тормозил проект при изменении размеров этого окна - во многих программах есть фоновые рисунки, и они не тормозят при изменении размеров этих программ, например: Opera 10, Qt Creator...)
3. И если QWidget подходит (исходя из первого вопроса), тогда как на него установить фоновую картинку?

Хотелось бы конечно использовать QWidget...
Пробую установить фоновую картинку таким образом:

Код:
void IFaceWClass::paintEvent(QPaintEvent *event)
 {
    painter = new QPainter(this);
    background = new QPixmap("D:\\ear.png");
    painter->drawPixmap(0, 0, background->width(), background->height(), *background);
 }

Но невыходит, в документации сказанно что с QPainter нужно работать в обработчике события paintEvent, класса-потомка QWidget - вроде все делаю правильно - картинка есть, painter, background - объявленны в заголовочном файле этого класса (т.е. IFaceWClass)...

Разьясните мне пожалуйста выше описанные моменты, я изучал документацию, рылся по форуму, но так и не получилось отрисовать фоновую картинку на QWidget...
Записан
alexman
Гость
« Ответ #1 : Октябрь 27, 2010, 21:08 »

А кто будет удалять память? Если при каждой перерисовке грузить данные с жесткого диска, то может томозить!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Октябрь 27, 2010, 21:14 »

см. QPalette.
Записан

Qt 5.11/4.8.7 (X11/Win)
pethead
Гость
« Ответ #3 : Октябрь 28, 2010, 03:46 »

а что надо создавать каждый раз qpainter?
посм в примерах qt, вроде что то было там с фоном (mice).
Записан
daenux
Гость
« Ответ #4 : Октябрь 28, 2010, 06:15 »

Хорошо, буду создовать в конструкторе класса объекты...

На счет QPolette:

Код:
palette = new QPalette();
    palette->setBrush(this->backgroundRole(), QBrush(QPixmap("D:\\ear.png")));
    this->setPalette(*palette);

(это в конструкторе класса)

И все тот же нулевой результат...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Октябрь 28, 2010, 09:04 »

palette->setBrush(QPalette::Window, QBrush(QPixmap("D:\\ear.png")));
Создавать QPalette через new не нужно. QWidget сам сохранит всё что нужно.
Записан

Qt 5.11/4.8.7 (X11/Win)
daenux
Гость
« Ответ #6 : Октябрь 28, 2010, 09:15 »

Да! Так получилось (QPalette) - Спасибо!!!

Вот только как сделать так что бы это самое изоброжение расстягивалось либо сжималось отностительно размеров QWidget?

А то изображение достаточно большого размера и картинка выходит за границы виджета...

И где здесь людям Спасибо кнопочку нажимать?
Записан
daenux
Гость
« Ответ #7 : Октябрь 28, 2010, 09:18 »

В документации по QPalette я такого что то найти не могу...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Октябрь 28, 2010, 10:17 »

Вот один из вариантов:
Код
C++ (Qt)
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class MyWidget : public QWidget
{
public:
MyWidget( const QString& fn, QWidget* p = 0 )
: QWidget( p )
{
bg.load( fn );
}
 
protected:
void paintEvent( QPaintEvent* e )
{
if( bg.isNull() )
{
QWidget::paintEvent( e );
return;
}
 
QPainter p( this );
 
qreal xs = qreal( width() ) / qreal( bg.width() );
qreal ys = qreal( height() ) / qreal( bg.height() );
 
if( xs != 1 || ys != 1 )
{
QImage img;
int cx = qRound( e->rect().x() / xs );
int cy = qRound( e->rect().y() / ys );
int cw = qRound( e->rect().width() / xs );
int ch = qRound( e->rect().height() / ys );
cw = qMin( cw, bg.width() - cx );
ch = qMin( ch, bg.height() - cy );
img = bg.copy( cx, cy, cw, ch );
cw = qRound( cw * xs );
ch = qRound( ch * ys );
img = img.scaled( cw, ch, Qt::IgnoreAspectRatio,
/*Qt::SmoothTransformation :*/ Qt::FastTransformation );
p.drawImage( e->rect().topLeft(), img );
} else
{
p.drawImage(
e->rect().topLeft(),
bg,
QRect( e->rect().x(), e->rect().y(),
qMin( e->rect().width(), bg.width() ),
qMin( e->rect().height(), bg.height() ) ) );
}
}
QImage bg;
};
 
int main( int argc, char* argv[] )
{
QApplication a( argc, argv );
 
MyWidget w( argc > 1 ? argv[1] : "" );
w.show();
 
return a.exec();
}
 
Его большой плюс в том, что он самый быстрый и не нужно держать на Xserver-e или GDI пиксмап

Второй вариант проще в написании, но намного тормознутее:
Код
C++ (Qt)
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class MyWidget : public QWidget
{
public:
   MyWidget( const QString& fn, QWidget* p = 0 )
   : QWidget( p )
   {
       bg.load( fn );
       br.setTextureImage( bg );
   }
 
protected:
   void paintEvent( QPaintEvent* e )
   {
       QPainter p( this );
 
       br.setMatrix( QMatrix(
               qreal( width() ) / qreal( bg.width() ), 0, 0,
               qreal( height() ) / qreal( bg.height() ), 0, 0 ) );
       p.setPen( Qt::NoPen );
       p.setBrush( br );
       p.drawRect( e->rect() );
   }
   QImage bg;
   QBrush br;
};
 
int main( int argc, char* argv[] )
{
   QApplication a( argc, argv );
 
   MyWidget w( argc > 1 ? argv[1] : "" );
   w.show();
 
   return a.exec();
}
 
« Последнее редактирование: Октябрь 28, 2010, 11:13 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
daenux
Гость
« Ответ #9 : Октябрь 28, 2010, 11:25 »

Уху!!! Спасибо!!! Код суперский!!!

Работает все замечательно!!!

Документацию изучил, все понял - Qt::IgnoreAspectRatio!!!

Только вот работает с форматом .jpg а с .png нет, почему?
Записан
daenux
Гость
« Ответ #10 : Октябрь 28, 2010, 11:27 »

Тот код, что первый я имею в веду...

Сейчас второй вариант испробую!!!
Записан
daenux
Гость
« Ответ #11 : Октябрь 28, 2010, 11:38 »

Отличия в производительности что то не заметил...

Оба метода работают превосходно!!!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Октябрь 28, 2010, 11:40 »

Цитировать
Отличия в производительности что то не заметил...
Зависит от размера окна и самой подложки.
Записан

Qt 5.11/4.8.7 (X11/Win)
daenux
Гость
« Ответ #13 : Октябрь 28, 2010, 11:44 »

Кстате, PNG отображает так же прекрасно, но только ту что мне нужна, не отображает...

Почему это может быть? (картинка warty из релиза 10.10 Ubuntu)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Октябрь 28, 2010, 11:59 »

Натравите на этот файл 'file' - вполне возможно, что это и не png вовсе.
Если при загрузке картинки не указывать её формат, то Qt пытается определить формат по расширению и в таком случае может обломиться.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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