PDA

View Full Version : Image processing



NicNac
18th August 2008, 19:18
Hi guys
Im new to Qt currently installed Qt4 on Mac OS X, I read through some of the documentation (C++-GUI-Programming-with-Qt-4-1st-ed), but it only gives some basic stuff. I want to load multiple images from the hard disk and display them one after the ohter in a GUI program. I need a starting point. please lead the way im prepared to do all that is needed from my part.

aamer4yu
18th August 2008, 20:13
I need a starting point. please lead the way im prepared to do all that is needed from my part.
Refer the Image Viewer example in Qt Demo.

You can very easily show an image on a QLabel. If you want to show multiple images in a single area, you can use QLabel with QTimer to get the effect of slideshow.

Otherwise, you can add QLabel in a layout and display multiple images

Hope this helps :)

wysota
18th August 2008, 20:19
A starting point would be to read about QLabel, QPixmap and QTimer.

NicNac
18th August 2008, 22:36
thanks guy i'll give it a look

NicNac
25th August 2008, 22:41
Now i can load photos, but i can only do it when i know the exact names of the files. My next mission is to browse a folder and load all the pictures (jpg format for now), display them one after another (a slide show kind of thing). Any suggestions?

wysota
26th August 2008, 09:39
QDir and QDir::entryList().

aamer4yu
26th August 2008, 10:35
Or may be QFileDialog::getOpenFileNames .

QFileDialog::getOpenFileNames(this,"Select one or more files to open","/home","Images (*.png *.xpm *.jpg)");

NicNac
26th August 2008, 20:23
Thanks guys for all your help, i'm making progress on my application. Next mission, I want to customize buttons by say linking the file browsing action with a button. The only options i can find is the ones preinstalled. should i define my own slots or is there a better way?

wysota
27th August 2008, 12:13
Read a tutorial and browse Qt Assistant please :)

NicNac
19th September 2008, 11:36
Hi,

i am trying to do a slideshow. I have the images load and everything else work i.e. next, back between the pictures.

I would like to automate it with Qtimer, i call the method to start the slideshow in the method i use the Qtimer like this:



QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(nextPicture()));
timer->start(30000);

Is this the write way?

wysota
19th September 2008, 12:20
Yes, this is ok.

aurelius
29th October 2008, 14:19
Hi, I am a newbie in QT4, however really enthusiastic with all the capabilities of it.

What I want to do is to have a grid of images, and display them, like this program

http://www.youtube.com/watch?v=kVcTMAUr3Bw

I mean, I want to display them in a grid and if possible, when I resize the window, the grid and the images contained in it to adjust. I guess I will have to follow

these instructions:

Refer the Image Viewer example in Qt Demo.

Otherwise, you can add QLabel in a layout and display multiple images

Hope this helps :)

Is this right? I guess, in order for the images to adjust, I will have to use grid layout. Because I can't really recall right now, is it possible to dynamically add widgets inside the QGridLayout, that is I check what images are contained in a directory and display them in a grid mode ? Is this right?

Do you have any other advice or sample code that does sth similar?

P.S. I just found this forum, which was a relief, because the tutorials in QT4 website are basic.

wysota
29th October 2008, 15:48
I think this is dome using GraphicsView so take a look at QGraphicsView and QGraphicsScene.

aurelius
29th October 2008, 17:01
Thanx for the quick answer.

Do you know iff there is somewhere some demo code for QGraphcisScene etc ? Of course, I will try to figure out how it works, but it's kinda difficult by just reading the properties of it, since I am just a beginner.

Ok, I just realized that there are some tutorials in QT4 site.

wysota
29th October 2008, 17:45
Open a terminal and type in "assistant".

aurelius
29th October 2008, 19:57
I use Ubuntu 8.04 and I program with just a text editor and console. Unfortunately the repositories don't have the latest version of Qt, so QGraphicsProxyWidget are not part of the library. Of course, I don't know if it's even useful, but ok, I just don't have access on it. Also, there are not the functions that are related to it, such as the addWidget in QGraphicsScene. This function I guess it's really important. I downloaded and compiled the newer version of Qt, however the makefile throws error. I use a modified qmake that I took from a QDevelop program and it has some include paths. I changed them and it suddenly started to throw some errors. Do you have any qmake that it would work properly?

I think I will have to create my own makefiles with my own qmake, but that is a problem.

Whatsoever, I tried to do sth with grid layout. I managed to put two images in a grid layout, so I guess I can do it for more images. However, I don't know how to do it, so as automatically to change for the position of those images acoording to the with of the main window. I will try to make QGraphics class work properly, but do you have any idea for this as well?

wysota
29th October 2008, 20:22
Of course, I don't know if it's even useful, but ok, I just don't have access on it.
Not in your case. You need a plain graphicsview and QGraphicsPixmapItems.


Do you have any qmake that it would work properly?
Always use only the instance of qmake that comes with your installation, be it a binary or an own build originated.


I think I will have to create my own makefiles with my own qmake, but that is a problem.
No, you need to read a tutorial or two. Don't make things more complex than they are.


Whatsoever, I tried to do sth with grid layout. I managed to put two images in a grid layout, so I guess I can do it for more images.
Forget it. Read about QGraphicsView, pretty please.

aurelius
29th October 2008, 20:58
Yeah I think you are right. :) This is what I am doing now.

Well, I think now I have found the info I needed for the first and basic task I wanted to do: to order images one after the other in a grid. I found the drill down example which does a similar thing. Now, i would like the grid to refresh, an adjust the number of images it shows, according to the width of the window. Except for the way, with which I catch the event of resizing the window, computing the dimensions, comparing them with image dimensions and setting the new GraphicsPixmapItem coordinates, is there any automatic way for doing all these ?

wysota
29th October 2008, 22:52
No, you have to modify the scene size to reflect the view's viewport size and react on scene resizes. Basically all should be done in the scene apart from resizing the scene itself.

aurelius
30th October 2008, 09:43
From what you saying, I understand this:

1) I have to create a QGraphicsScene item. From all the reading I ve made, this is the class that manages all items inside the area.

2) I have to create a QGraphicsView item. This item is for visualizing the whatever contents of QGraphicsScene.

3) I add items in the QGraphicsScene. I use the function addPixmap. I add them to the scene and display them. However, the documentation says, that items are by default positioned to (0,0). So, if I add 2 items, the second overlaps the first. I can change the position of the item with the use of GraphicsPixmapItem->setOffset(...). What I was trying all along to find out is the following: in order to have several pixmap items in the scene, and order them into a grid, how do I define the position of the items? Is there some function that layouts them like that or I have to define myself the position of the items with setOffset() function ? That is, is there any function that says to the scene:
"ok, put this pixmap from top to right, where there is empty space" because from what I ve read till now(and maybe because I am a beginner in GUIs), the only function I can do is "ok, put the pixmap in (0,0), if the programmer wants sth else, he will change it by himself later".

4) I understand what you are saying with the size and stuff. What I don't understand is the following: I can define the scene rect. When I show the QGraphicsView, doesn't it show this rect ? What do you mean, that the scene size must reflect the view's size. The documentation says, that if you don't mess with QGraphicsView's sceneRect, it takes by default the rect of the QGraphicsScene, which means the one rect relfects to the other. Or not ?

aurelius
30th October 2008, 16:34
I found out, that in Q3, this operation was able to be performed with the use of Q3Canvas and tiles. Is that right?

wysota
30th October 2008, 22:49
1) I have to create a QGraphicsScene item. From all the reading I ve made, this is the class that manages all items inside the area.

2) I have to create a QGraphicsView item. This item is for visualizing the whatever contents of QGraphicsScene.
Yes, that's more or less correct.


I can change the position of the item with the use of GraphicsPixmapItem->setOffset(...).
No, this is wrong. You need to use QGraphicsItem::setPos().


What I was trying all along to find out is the following: in order to have several pixmap items in the scene, and order them into a grid, how do I define the position of the items?
You have to set positions of each of the pixmaps in such way that each consecutive pixmap is moved to the right by the sum of widths of all previous pixmaps. When you don't have enough space left, reset the x coordinate and instead increase the y coordinate by the height of the previous row.


I can define the scene rect. When I show the QGraphicsView, doesn't it show this rect ?
Yes, it does.

What do you mean, that the scene size must reflect the view's size.
You always want to show the whole width of the scene. If you don't change the scene but reduce the size of the view that displays it, you'll get scrollbars which is probably not what you want.


The documentation says, that if you don't mess with QGraphicsView's sceneRect, it takes by default the rect of the QGraphicsScene, which means the one rect relfects to the other. Or not ?

Yes, but you might want to resize the view, right? The scene won't accomodate - it doesn't work both ways.

aurelius
31st October 2008, 08:57
Yes, that's more or less correct.
You have to set positions of each of the pixmaps in such way that each consecutive pixmap is moved to the right by the sum of widths of all previous pixmaps. When you don't have enough space left, reset the x coordinate and instead increase the y coordinate by the height of the previous row.


This is what I was trying to say from the beginning.

Now, I try to synchronize the size of the sceneRect with the size of the View window.

When I catch the event for resizing the window, I resize the sceneRect as well. But it doesn't. Also, when I use the setPos, (I had already tried that), it puts the pixmaps in irrelevant places. I guess, the coordinated I give are for the sceneRect, and I want the coordinates for the view windows. For example when I say: put it to (0,0), it puts it to sceneRect's (0,0), not to the window's. Right ?

aurelius
31st October 2008, 11:59
Ok, I did most of what I wanted.

The ResizeEvent is activated when you push the mouse button and then release it. If I want to activate it, when you just press the mouse button, what should I do. Should I reimplement the event ???

aurelius
31st October 2008, 13:16
I wanted to ask as well, why when I open the QGraphicsView window, it does'nt open it with the scrolls in the start but from the middle.

Also, I added a hover event on the pixmaps and when i hover them, I am scaling them in order to give the feeling of slight zoom. When I leave the pixmap it returns to its original position. However, it doesn't work quite well. Theoretically, it takes its original size, but if i hover again multiple times over the same pixmap, it slightly changes slowly size. I guess this has sth to do with the accuracy of the numbers. I use double variables though, so I don't know why it's happening. Should I declare variables like qfloat etc? Will there be any difference ?

aurelius
2nd November 2008, 10:05
Also, I added a hover event on the pixmaps and when i hover them, I am scaling them in order to give the feeling of slight zoom. When I leave the pixmap it returns to its original position. However, it doesn't work quite well. Theoretically, it takes its original size, but if i hover again multiple times over the same pixmap, it slightly changes slowly size. I guess this has sth to do with the accuracy of the numbers. I use double variables though, so I don't know why it's happening. Should I declare variables like qfloat etc? Will there be any difference ?

Does anyone have a clue on this please ?