Well I don't will write you the code but, wouldn't it be smarter to check the extension first, before removing something from the front? (Just came now in my mind...)
Well I don't will write you the code but, wouldn't it be smarter to check the extension first, before removing something from the front? (Just came now in my mind...)
hakermania (30th January 2011)
Thanks, you're right, just did it:
I removed the string comparison for testing and it's the same without it, so it hasn't to do with it....hmmm...Qt Code:
for(int i=1; i<=event->mimeData()->urls().length(); i++){ if(extension=="png" || extension=="gif"){ ui->listWidget->addItem(file1); } }To copy to clipboard, switch view to plain text mode
When you 're trying to help somebody in the newbie section, don't forget that he is a newbie. Be specific and give examples.
Ok, next, have a look at the sources of QMimeData::urls() and decide if it is a wise decision to call it all over again and again...
hakermania (5th February 2011)
It sure is not a good idea (a serious flaw indeed) to alter a list inside a loop where one of the loop parameters is based on that list.
In other words, do not call a list size when you change that list inside the loop! Nasty things happen.
(Might not be related to your problem though)
hakermania (5th February 2011)
Try this :
Qt Code:
QList<QUrl> urlList = event->mimeData()->urls(); for (QList<QUrl>::const_iterator i = urlList.begin(); i != urlList.end(); i++) { if (strFile2.endsWith(".png") || strFile2.endsWith(".gif")) { ui->listWidget->addItem(strFile1); } }To copy to clipboard, switch view to plain text mode
hakermania (5th February 2011)
We should encourage people to think about problems and to came up with a solution of their own. There is no benefit of simply paste a better code/solution. Furthermore, can you explain me the meaning of subtraction of 2 in this line:?Qt Code:
To copy to clipboard, switch view to plain text mode
hakermania (5th February 2011)
Ok I have looked into the code again and i see that this makes no sense. For example we have got:
- http://mycoolwebsite.de/image.png/
- http:// -> 7
So , i guess he wants to remove the http:// and the extension ?
If so, that
Qt Code:
To copy to clipboard, switch view to plain text mode
makes no sense. Maybe this solution would be better: (we have checked already for .png and .gif, so this should be correct)
Qt Code:
To copy to clipboard, switch view to plain text mode
hakermania (5th February 2011)
To say it: First parameter indicates the starting point, last the length of the "resulting" string, so strFile2.length() - 2 is too long since only strFile2.length() - 7 left. Thus one should simply pass -1 as a last parameter. That is what I was trying to tell. Furthermore QString::remove()is probably better for his intention - I guess.
Thank all of you, Sven's solution worked, but Lykurg's right, I don't understand why the code provided is better than my first posted, so i really want to understand my mistake in order to avoid it to the feature?
When you 're trying to help somebody in the newbie section, don't forget that he is a newbie. Be specific and give examples.
Here's your original code:
Qt Code:
for(int i=1; i<=event->mimeData()->urls().length(); i++){ if(extension=="png" || extension=="gif"){ //add to the listwidget item->setText(file1); ui->listWidget->addItem(item); } }To copy to clipboard, switch view to plain text mode
And so you're saying you still don't understand why it runs so slowly?I don't understand why the code provided is better than my first posted, so i really want to understand my mistake in order to avoid it to the feature?
OK, others have pointed this out, but maybe it wasn't clear. Aside from all the strange stuff you are doing to the string once you get it out of the URL, the main reason why your original code runs slowly is this:
You're calling this string of methods *twice* for every time through the loop, once when counting the length of the urls in the for statement, and again when you retrieve the QUrl.
You're making three method calls in that single line: retrieving the mimeData from the event, then retrieving the urls from the mimeData, then doing something with the urls (like getting the length or a specific URL).
One (or more) of those three calls is very time intensive. Maybe it's getting the mimeData from the event, maybe it's parsing the mimeData to retrieve the URLs. Doesn't matter. It's the cause of the slowness. String manipulations and comparisons are blindingly fast compared to that.
What does matter is that information is what is called "loop invariant". It is essentially a constant for the entire duration of the loop. So, move it outside the loop as Sven first suggested. Then, you retrieve the mimeData from the event exactly once, and you parse the mimeData into the urls exactly once, and all the rest of the loop simply deals with the urls collection. If I were writing it, I'd even retrieve the urls length into a local variable (int nUrls = urls.length()) and use that as the loop termination condition instead of calling length() repeatedly. I'd also use a more descriptive name for the loop iterator (instead of a generic "i") so that next time I read the code, it is clear to me that I am iterating over urls and not something else.
Qt Code:
const QList<QUrl> & urlList = event->mimeData()->urls(); int nUrls = urlList.length(); for ( int nUrl = 0; nUrl < nUrls; nUrl++) { // ... }To copy to clipboard, switch view to plain text mode
Hope this helps. No flames please from those who would complain that I'm "doing someone's homework". I think the OP really doesn't understand why his original code is slow despite all the other help.
hakermania (6th February 2011)
I also like foreach because its easy to use, avoids unnecessary copying and very readable and the performance is ok:
Qt Code:
foreach(const QUrl& url, event->mimeData()->urls()) { //work }To copy to clipboard, switch view to plain text mode
As the documentation says.Qt automatically takes a copy of the container
So make me correct, but isn't foreach loop something useful when iterating through the container holding pointers not entire objects, because in other way we use 2 times original_container_size amount of memory ?
My schedule makes my cry
My works makes my laugh
My life makes... oh...no....
It depends on the container. All Qt containers are implcitly shared so only a shallow copy of the container is made, the real data is not copied. If you create your own container (or use some 3rd party code) that doesn't share data between its copies then foreach will cause an immediate overhead in both memory and time because the container will have to be copied.
Bookmarks