tags:

views:

89

answers:

4

I am trying to do console application to read pixels from image:

#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();
}

That doesn't work I got: (IT doesn't compile, but anyway file isn't exist yet...)

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

What is going on? Is it impossible to use Qimage with console app?!

EDIT: screen

A: 

img->isNull() doesn't do anything on it's own, try this instead:

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

My guess is that the local directory of the executable is not the same as the location of that image, so Qt can't find the file. Try specifying the complete path.

EDIT: Ahh... didn't realize it was a compilation problem. That looks suspiciously like a moc issue. What build system are you using? and can you confirm that the moc step is executing?

jkerian
Yes hmm that file doesn't exist, I suppose that will be return isnull == true ?
John X
+1  A: 
QImage("adadad.jpg");

Will probably look for a file called adadad.jpg on the current working directory for your application. Check if that file is present. Otherwise, use a fully qualified path.

dirkgently
Yes hmm that file doesn't exist, I suppose that will be return isnull == true ?
John X
Yes, it ought to. You need to check the return value though using a `if` statement. Try: `if (img->isNull()) std::cerr << "invalid image" << std::endl;`
dirkgently
Whether the file exists or not is a runtime thing. It can't break compilation.
Frank
@Frank: That information wasn't there when I posted my answer.
dirkgently
A: 

This modification of your code will compile and run as expected if there is a valid image file in the current working directory when you run the app. It will display 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;

}

You do not need to create an instance of QCoreApplication unless you have subclassed it and put your program code in that subclass.

Update: Your program does not exit so you are probably getting that compile error because it can't replace the executable because it is still running (and locked). The file locking is more likely to be an issue under Windows.

Arnold Spence
On a sane Unix system, executable files are not locked even if the program is running.
ypnos
True. I've updated my answer to identify Windows as the platform to more likely suffer this issue.
Arnold Spence
+3  A: 

It is possible to use QImage in a console application, you must make sure that QtGui is configured though. If you chose a console app, your .pro file might contain something like

CONFIG += console
QT -= gui

If that's the case, remove the QT -= gui line.

Frank
Yes it helps, thx a lot :) Cheers!
John X