Как печатать с помощью qwebview с помощью qt

При доступе к ссылке из браузера есть кнопка печати, и когда вы нажимаете ее, отображается функция печати. И я не могу сделать это в своей программе с qwebview. Я использую qt4.7.3 в Ubuntu 11.04.


person reggie    schedule 21.01.2014    source источник


Ответы (2)


QWebView имеет метод void print(QPrinter * printer) const. Чтобы отобразить диалоговое окно печати, вы должны использовать класс QPrintDialog.

Вам нужно подключить QAction или какой-либо другой сигнал к слоту, который показывает диалоговое окно печати, и другой слот к сигналу accepted диалога.

class MyWindow : public QWidget {
    Q_OBJECT
    QWebView * m_webView;
    QScopedPointer<QPrinter> m_printer;
    ...
    Q_SLOT void showPrintDialog() {
        if (!m_printer) m_printer.reset(new QPrinter);
        QScopedPointer<QPrintDialog> dialog(new QPrintDialog(m_printer.data(), this));
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        connect(dialog.data(), SIGNAL(accepted(QPrinter*)), SLOT(print(QPrinter*)));
        dialog->show();
        dialog.take(); // The dialog will self-delete
    }
    Q_SLOT void print(QPrinter* printer) {
        m_webView->print(printer);
    }
};
person Kuba hasn't forgotten Monica    schedule 21.01.2014

Я использовал ответ Кубы Обера и использовал его в своем проекте следующим образом:

Файл .ui содержит QWebView с именем 'webView', вы можете просто создать его в режиме дизайна QtCreator.

Содержимое .h файла

#include <QDialog>
#include <QPrinter>
#include <QPrintDialog>

namespace Ui {
class myclassname;
}

class myclassname : public QDialog
{
    Q_OBJECT

public:
    explicit myclassname(QWidget *parent = 0);
    ~myclassname();

private slots:
    void print(QPrinter* printer);

    void on_pushButton_print_clicked();

private:
    Ui::myclassname *ui;
    QScopedPointer<QPrinter> m_printer;
};

Содержимое файла .cpp

#include "myclassname.h"
#include "ui_myclassname.h"

myclassname::myclassname(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::myclassname)
{
    ui->setupUi(this);
    ui->webView->load(QUrl("https://stackoverflow.com/questions/21260463/how-to-print-using-qwebview-using-qt"));
}

myclassname::~myclassname()
{
    delete ui;
}

void myclassname::print(QPrinter* printer)
{
    ui->webView->print(printer);
}

void myclassname::on_pushButton_print_clicked()
{
    if (!m_printer) m_printer.reset(new QPrinter);
    QScopedPointer<QPrintDialog> dialog(new QPrintDialog(m_printer.data(), this));
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    connect(dialog.data(), SIGNAL(accepted(QPrinter*)), SLOT(print(QPrinter*)));
    dialog->show();
    dialog.take(); // The dialog will self-delete
}

Спасибо @KubaOber

person Wim    schedule 23.08.2017
comment
Я заметил, что фон моего QWebView остается «серым», и для этого используются ненужные чернила. Я решил, добавив ui->webView->setStyleSheet("background-color: white"); в конструктор, прямо перед строкой ui->webView->load(QUrl... - person Wim; 23.08.2017