2016-07-19 4 views
0

Ich habe Schwierigkeiten, ein Bild im PNG-Format mit Qt4 zu drucken. Der folgende Code hat Standardeinstellung entweder PDF oder PS, aber keine Möglichkeit, PNG zu wählen:So drucken Sie im PNG-Format mit Qt4

void DetectorView::printToFile() 
{ 

// A basic printing function 
QPrinter printer; 
QPrintDialog dialog(&printer, this); 
if (dialog.exec()==QDialog::Accepted) { 
    QPainter painter(&printer); 
    this->render(&painter); 
    std::cout << "INFO [DetectorView::printToFile] Wrote file " << std::endl; 
} 
else { 
    std::cout << "INFO [DetectorView::printToFile] Cancelling printer " << std::endl; 
} 
} 

Jede mögliche Hilfe würde geschätzt!

+0

Muss dies wirklich 'QPrintDialog' verwenden? Warum rendern Sie nicht einfach ein 'QImage' und verwenden dann' QImage :: save' (http://doc.qt.io/qt-5/qimage.html#save)? –

Antwort

1

Mit diesem Link: Rendering QWidget to QImage loses alpha-channel können Sie Ihr Widget zu einem QImage rendern.

Dann, mit QImageWriter, können Sie es zu einem png speichern:

// render QWidget to QImage: 
QImage bitmap(this->size(), QImage::Format_ARGB32); 
bitmap.fill(Qt::transparent); 
QPainter painter(&bitmap); 
this->render(&painter, QPoint(), QRegion(), QWidget::DrawChildren); 

// save QImage to png file: 
QImageWriter writer("file.png", "png"); 
writer.write(bitmap); 

Hinweis: ausgebrachten Links für QT5 sind, aber dies sollte mit Qt4 arbeiten.

+0

Das funktioniert, aber nicht wirklich das Verhalten, nach dem ich gesucht habe. Es muss eine interaktive GUI geben, wo Sie Dateinamen und Speicherorte ändern können. Trotzdem, danke! Es half mir, meine Lösung zu bekommen, die ich unter –

+0

veröffentlichen werde. Das ist wirklich ein Detail, wie Sie vorgeschlagen haben, verwenden Sie einfach 'QFileDialog :: getSaveFileName', um den Dateinamen aufzunehmen. – jpo38

+0

Fair genug, akzeptiert. –

0

jpo38 Antwort verwenden, erweiterte ich das Verhalten bekommen ich wollte:

void DetectorView::printToFile() 
{ 
    QString default_name = "myImage.png"; 
    QImage bitmap(this->size(), QImage::Format_ARGB32); 
    QPainter painter(&bitmap); 
    this->render(&painter,QPoint(),QRegion(),QWidget::DrawChildren); 
    QString filename = QFileDialog::getSaveFileName(this, tr("Save File"),QDir::homePath()+"/"+default_name,tr("Image Files (*.png *.jpg *.bmp)")); 
    QImageWriter writer(filename, "png"); 
    writer.write(bitmap); 
    std::cout << "INFO [DetectorView::printToFile] Wrote image to file" << std::endl; 
} 

Notiere die QFileDialog, die benötigt wird, um das interaktive Fenster zu erstellen.