четверг, 29 марта 2012 г.

Рисование QImage на форме


Рисование QImage на форме
(релиз Qt SDK на момент написания данной статьи - 1.2.0)



Очень часто стоит задача вывести какое-то изображение на форму, будь то график, фотография или ещё какая-нибудь хрень.
В C++ Builder всё было просто (ох и давно это было), добавил Picture и выбрал картинку... В Qt малость сложнее, но и возможности значительно шире.



Наша основная задача, переопределить метод
void QWidget::paintEvent ( QPaintEvent * event )

Кратко о главном:
метод paintEvent вызывается каждый раз, когда нам необходимо перерисовать форму. А форма перерисовывается в следующих случаях:

1) Перемещение
2) Изменение размера формы
3) Наложение на другую форму/закрытие другой формой.

Во всех этих случаях нам надо просто рисовать нашу картинку.

Заголовочный файл будет выглядеть так:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPicture>
#include <QImage>
#include <QPainter>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void paintEvent(QPaintEvent *); // пееопределение виртуальной функции
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H



Переопределенная функция выглядит следующим образом:

void MainWindow::paintEvent(QPaintEvent *)
{
    QImage img("C:/glomacs.png"); // загружаем картинку
    QPainter painter(this); // определяем объект painter, который обеспечивает рисование
    painter.drawImage(0,0, img.scaled(this->size())); // рисуем наше изображение от 0,0 и растягиваем по всему виджету
}
я остановлюсь только на функции drawImage. В нашем случае первое значение - координата Х верхнего левого угла, от которого будем рисовать изображение. Второе значение - координата Y верхнего левого угла. Ну а третье значение, само рисуемое изображение. img.scaled(this->size()) возвращает наше изображение с измененным размером, в данном случае размер изображения равен размеру виджета.



3 комментария:

  1. Спасибо, помогло. )В отличии от setStyleSheet() не затрагивает фон кнопок и прочих элементов на форме.

    ОтветитьУдалить
  2. Понятно что при перемещении окна с изображением, функция каждый раз рисует картинку заново. Но не ясно почему окно подвисает при перемещении?

    ОтветитьУдалить
    Ответы
    1. Как же не ясно? Если в методе MainWindow::paintEvent у вас будет каждый раз вызываться конструктор QImage img("C:/glomacs.png"), то картинка не только каждый раз перерисовывается, но и каждый раз загружается. Загрузить картинку надо только раз, в конструкторе окна, например, а потом только рисовать.

      Удалить