2013-05-03 118 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

相關問題