Шаг 249.
Библиотека Qt.
Пример вывода на печать

    На этом шаге рассмотрим пример приложения, демонстрирующего вывод на печать.

    Пример, показанный на рис. 1, иллюстрирует вывод на печать. При нажатии на кнопку Print (Печать) откроется диалоговое окно настроек принтера и после подтверждения будет осуществлен вывод картинки на печать.


Рис.1. Пример приложения с выводом на печать

    Определим класс Printer следующим образом:

class Printer : public QWidget {
    Q_OBJECT

private:
    QPrinter* m_pprinter;  //указатель на объект принтера

protected:
    virtual void paintEvent(QPaintEvent* pe  );
            void draw      (QPaintDevice* ppd);  /*получает указатель
                                                   на контекст рисования*/
public:
    Printer(QWidget* pwgt = 0);
    virtual ~Printer();  /*деструктор, в котором освобождается
                           динамически выделяемая память для объекта принтера*/
public slots:
    void slotPrint();  //вызывается для выполнения вывода на печатающее устройство
};

    Рассмотрим реализацию методов и слота класса Printer:

Printer::Printer(QWidget* pwgt/*=0*/) : QWidget(pwgt)
{
    m_pprinter = new QPrinter;  /*в конструкторе динамически создается
                                  объект принтера*/
}

/*virtual*/Printer::~Printer()
{
    delete m_pprinter;  /*объект необходимо, по завершении работы программы,
                          удалить*/
}

/*virtual*/ void Printer::paintEvent(QPaintEvent*)
{
    draw(this);  /*в методе обработки события перерисовки вызывается
                   метод draw() и в него, в качестве контекста
                   рисования, передается указатель this*/
}

void Printer::slotPrint()
{
    QPrintDialog dlg(m_pprinter, this);  /*при создании диалогового окна
                                          (переменная dlg) в его конструктор
                                          передаются указатели на объект принтера
                                          (m_pprinter) и на виджет предка.
                                          Второй параметр нужен для того, чтобы
                                          диалоговое окно было отцентрировано
                                          относительно основного окна*/

    dlg.setMinMax(1, 1);  /*устанавливается диапазон страниц, которые можно печатать.
                            В нашем случае это всего одна страница, поэтому этот
                            диапазон устанавливается от 1 до 1*/

    /*Вызов метода exec() откроет диалоговое окно, в котором пользователь может
      выбрать принтер и настроить опции печати. При нажатии на кнопку OK метод
      возвращает QDialog::Accepted. После этого объект QPrinter полностью готов
      к использованию и его указатель m_pprinter передается методу draw().
      После того как в диалоговом окне будут выполнены все необходимые изменения,
      можно вычислить количество страниц для печати при помощи значений,
      возвращаемых методами QAbstractPrintDialog::toPage() и
      QAbstractPrintDialog::fromPage(), отняв от первого второе и прибавив единицу.
      Для нашего примера это выглядит следующим образом:
      int nPages = dlg.toPage() – dlg.fromPage() + 1;
      Чтобы получить следующий лист для рисования и напечатать на нем,
      нужно вызвать метод QPrinter::newPage() и передать указатель m_pprinter
      в метод draw().*/
    if (dlg.exec() == QDialog::Accepted) {
        draw(m_pprinter);
    }
}

void Printer::draw(QPaintDevice* ppd)  //передаются указатели на контекст рисования
{
    QPainter painter(ppd);
    QRect    r(painter.viewport());  /*чтобы избежать вывода на недоступные для
                                       принтера места, нужно опросить прямоугольную
                                       область вывода, используя метод
                                       QPainter::viewport()*/
    painter.setBrush(Qt::white); //устанавливаются кисти
    painter.drawRect(r);  //выводится прямоугольник
    painter.drawLine(0, 0, r.width(), r.height());  //выводится линия
    painter.drawLine(r.width(), 0, 0, r.height());

    painter.setBrush(Qt::NoBrush);
    painter.setPen(QPen(Qt::red, 3, Qt::DashLine));  //устанавливаются перья
    painter.drawEllipse(r);  //выводится эллипс

    painter.setPen(Qt::blue);
    painter.setFont(QFont("Times", 20, QFont::Normal));  /*устанавливает шрифт для
                                                           выводимого текста*/
    painter.drawText(r, Qt::AlignCenter, "Printer Test");  //выводится текст
}

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим понятие элемента со стилем в Qt.




Предыдущий шаг Содержание Следующий шаг