2016-07-19 2 views
0

Я изо всех сил пытаюсь распечатать изображение в формате PNG с помощью Qt4. ниже код имеет параметры по умолчанию либо PDF или PS, но никоим образом не выбирать PNG:Как печатать в формате PNG с 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; 
} 
} 

Любая помощь будет оценен по достоинству!

+0

Нужно ли это использовать 'QPrintDialog'? Почему бы просто не отрисовать 'QImage', а затем использовать [' QImage :: save'] (http://doc.qt.io/qt-5/qimage.html#save)? –

ответ

1

С помощью этой ссылки: Rendering QWidget to QImage loses alpha-channel, вы можете визуализировать свой виджет на QImage.

Затем, используя QImageWriter, вы можете сохранить его в формате PNG:

// 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); 

Примечание: ссылки являются для Qt5, но это должно работать с Qt4.

+0

Это действительно работает, но не совсем то, что я искал. Должен быть интерактивный графический интерфейс, в котором вы можете изменить имена файлов и местоположения. Тем не менее, спасибо! Это помогло мне получить мое решение, которое я опубликую ниже. –

+0

Это действительно деталь, как вы предложили, просто используйте 'QFileDialog :: getSaveFileName' для получения имени файла пикапа. – jpo38

+0

Справедливо, принят. –

0

Используя ответ jpo38, я расширил, чтобы получить поведение я хотел:

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; 
} 

Обратите внимание на QFileDialog, который необходим для создания интерактивного окна.