На этом шаге рассмотрим пример приложения, демонстрирующего вывод на печать.
Пример, показанный на рис. 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.