2010-08-29 84 views
4

我試圖做的控制檯應用程序來讀取圖像像素:QT C++新手問題 - Qimage不工作?

#include <QtCore/QCoreApplication> 
#include <QtGui/QImage> 

#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QImage *img = new QImage("adadad.jpg"); 

    //std::cout << "Type filename:" << std::endl; 
    img->isNull(); 
    return a.exec(); 
} 

這並不工作,我得到:(IT不能編譯,但不管怎樣文件是不存在尚未...)

File not found: tmp/obj/debug_shared/main.o:: In function `main': 

這是怎麼回事?使用控制檯應用程序不能使用Qimage?

編輯: screen

+1

那是完整的錯誤? 「函數'main':」看起來像它的不完整。 – 2010-08-29 20:17:31

回答

6

可以在控制檯應用程序中使用QImage,但您必須確保已配置QtGui。如果你選擇了一個控制檯應用程序,你的.pro文件可能包含類似

CONFIG += console 
QT -= gui 

如果是這樣的情況下,刪除QT - =桂線。

+0

是的,它有幫助,thx很多:)乾杯! – 2010-08-29 20:45:40

+1

不要忘記刪除構建目錄。我記得要添加GUI模塊,但忘了這麼做,它一直抱怨缺少包含文件,即使它們出現在代碼完成中。從Qt Creator運行「全部清理」是不夠的。 – 2015-04-08 15:12:18

+0

@Daniel Saner:當談到模塊處理時,我從未體驗過。重新運行qmake(甚至應該在觸摸.pro文件時自動發生)應該就足夠了。 – 2015-04-08 21:01:02

0

img-> ISNULL()在它自己什麼都不做,試試這個來代替:

if(img->isNull()) 
    std::cout << "Image isNull!\n"; 
else 
    std::cout << "Image loaded\n"; 

我的猜測是,可執行文件的本地目錄與該圖像的位置不同,所以Qt無法找到該文件。嘗試指定完整的路徑。

編輯:啊......沒有意識到這是一個彙編問題。這看起來像一個moc問題。你使用的是什麼構建系統?你能確認moc步驟正在執行嗎?

+0

是的嗯,該文件不存在,我想這將返回isnull ==真? – 2010-08-29 19:43:14

0
​​

可能會在您的應用程序的當前工作目錄中尋找名爲adadad.jpg的文件。檢查該文件是否存在。否則,請使用完全限定的路徑。

+0

是的嗯,該文件不存在,我想這將返回isnull == true? – 2010-08-29 19:41:55

+0

是的,它應該。你需要通過使用'if'語句來檢查返回值。嘗試:if(img-> isNull())std :: cerr <<「invalid image」<< std :: endl;' – dirkgently 2010-08-29 19:46:57

+0

文件是否存在是運行時的事情。它不能破壞編譯。 – 2010-08-29 20:11:40

-1

如果在運行應用程序時當前工作目錄中存在有效的圖像文件,代碼的這種修改將按預期方式編譯和運行。它會顯示Image loaded

#include <QtGui/QImage> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    QImage *img = new QImage("adadad.jpg"); 

    if(img->isNull()) 
     std::cout << "Image is null"; 
    else 
     std::cout << "Image loaded"; 
    return 0; 

}

你並不需要創建QCoreApplication的實例,除非你有子類,並把你的程序代碼在該子類。

更新: 您的程序不會退出,所以你很可能得到那個編譯錯誤,因爲它不能代替可執行文件,因爲它仍在運行(並鎖定)。在Windows下,文件鎖定更可能是一個問題。

+0

在一個健全的Unix系統上,即使程序正在運行,可執行文件也不會被鎖定。 – ypnos 2010-08-29 20:16:02

+0

是的。我已經更新了我的答案,將Windows確定爲更可能出現此問題的平臺。 – 2010-08-29 21:05:30

-1

在代碼中直接使用"adadad.jpg"加載文件時需要注意一點。即使將文件放在debug/release文件夾中,如果以這種方式加載,QImage也將始終爲空。

昨天我遇到了這個問題,我通過使用Qt庫來獲得完整路徑:QCoreApplication::applicationDirPath()

有兩種方法可以實現這一點,第一種方法是創建img對象。

QImage img(QCoreApplication::applicationDirPath() + "adadad.jpg"); 
if(img.isNull()) 
{ 
    qDebug() << "Loading Error - file: adadad.jpg."; 
    return false; 
} 

或使用加載功能

QImage img; 
if(!img.load(QCoreApplication::applicationDirPath() + "adadad.jpg")) 
{ 
    qDebug() << "Loading Error - file: adadad.jpg."; 
    return false; 
}