2013-05-03 117 views
2

我有以下问题。我想抓取一个小部件并将其保存为图像。我想把它保存为png,jpeg和tiff。我写了下面的代码:Qt抓取小部件并保存图像

QString s = QFileDialog::getSaveFileName(this, "Save as", "Choose a filename", "PNG(*.png);; TIFF(*.tiff *.tif);; JPEG(*.jpg *.jpeg)"); 

std::string current_string = s.toLocal8Bit().constData(); 
//current_string = current_string + ".png"; 

char * buffer = new char[current_string.length()]; 
std::string temp = buffer; 
char* temp2 = &temp[0]; 
strcpy(buffer, current_string.c_str()); 

char* pch = strtok (temp2,"."); 
pch = strtok (NULL, "."); 


if(!QPixmap::grabWindow(m_widget->winId()).save(buffer,pch)) 
{ 
    QMessageBox::warning(this, "File could not be saved", "ok", QMessageBox::Ok); 
} 

这在我的笔记本电脑上正常工作。当我做一个Visual Studio安装程序时,它也可以在我的笔记本电脑上正常工作,但是当我将它安装在另一台PC上时,则png格式可以正常工作(保存正确的图像),但不能保存jpeg和tif。然后我在另一台电脑上试了一下,但是我在Visual Studio中直接用项目文件尝试了它。在那里我有我的电脑等所有项目设置,并有jpeg和tif不工作。 PNG的作品,但它只保存在该电脑上的白色图像。此外,我还尝试了安装文件和其相同的PNG =白色图像。

任何人都可以帮助我吗?

+1

你需要图像的插件,例如见这个问题:http://stackoverflow.com/questions/2241141/embedded-jpg-resources-not-loading-in-qt-应用程序 – 2013-05-03 15:19:23

+0

我已经尝试复制exe文件夹中的4个dll。但它也不起作用。这也不能解释为什么在一台电脑上的PNG图像是白色的,为什么它不能保存jpeg和png文件,当我在Visual Studio调试模式下尝试它时。 ? – CmasterG 2013-05-03 16:32:14

回答

5

以下是将窗口小部件另存为图像的最简单方法。这种方法适用于Qt的5:

ui->myWidget->grab().save("image.png"); 
+0

简短的回答 - 可以通过添加链接到文档以及其内容的摘要/描述(因为链接消失或移动)来改进 - 例如您找到参考的文档的部分或版本。欢迎来到SO。谢谢@ G.Cito: – 2014-06-21 13:04:44

+0

:) – Danio 2014-06-21 16:58:59

1

插件不直接进入应用程序EXE文件夹,而是在应用程序文件夹下的“插件”文件夹。我相信,我还必须至少将其放入“imageformats”文件夹中,而不是“插件”。这可能是一个不同的平台/特殊版本。

请参阅此Qt deployment guide for windows。

此外,您的“新char []”调用可能最终会崩溃。您需要预留空间,为空字符:

char * buffer = new char[current_string.length() + 1]; 

而且也,你并不需要所有的std :: string的东西只是为了获得一个扩展。随着时间的推移,这可能会令人沮丧。

QString saveFilename = QFileDialog::getSaveFileName(this, "Save as", "Choose a filename", "PNG(*.png);; TIFF(*.tiff *.tif);; JPEG(*.jpg *.jpeg)"); 

QString saveExtension = "PNG"; 
int pos = saveFilename.lastIndexOf('.'); 
if (pos >= 0) 
    saveExtension = saveFilename.mid(pos + 1); 

if(!QPixmap::grabWidget(m_widget).save(saveFilename, qPrintable(saveExtension))) 
{ 
    // since you have a widget, just use grabWidget() here. winId() would possibly have 
    // portability issues on other platforms. qPrintable(saveExtension) is effectively 
    // the same as saveExtension.toLocal8Bit().constData() 

    QMessageBox::warning(this, "File could not be saved", "ok", QMessageBox::Ok); 
} 
+0

非常感谢您的回答。这工作。但是我仍然有这样的问题,即5个抓取窗口工作,并且在一个PC上它保存了一个白色图像。 – CmasterG 2013-05-06 19:30:23

+0

嗯..奇怪。 PC上有什么不同吗? (不同的显卡,视频驱动版本,操作系统...?) – darron 2013-05-06 19:56:36

+0

这是一款Nvidia GTX470。其他PC也是Nvidia,其中一个有AMD卡。 – CmasterG 2013-05-06 23:45:27

相关问题