# Qtruby and the ListViewItemIterator

**URL:** <https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361>\
**Category:** Ruby\
**Created:** [November 17, 2006, 10:15pm UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361 "2006-11-17T22:15:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nigel\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e95f7d/32.png) [@Nigel\_W](https://www.ruby-forum.com/u/Nigel_W)\
**Post date:** [November 17, 2006, 10:15pm UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361/1 "2006-11-17T22:15:30Z")

</div>

Hi folks

I’m trying qtruby out and have struck an issue I can’t conquer.

I have a listview widget which is populated with listviewitems and want  
to iterate through the whole lot.

The code snippet is

it = Qt::ListViewItemIterator.new(@listView)  
puts it.operator++()

The “puts” is only there so I can see what’s happening.

When I run the app I get the following all on one line (not 2 lines  
as here):-

/mainform.ui.rb:33:in `method_missing': undefined method`operator’ for  
#Qt::ListViewItemIterator:0xb6c08c24 (NoMethodError)

I’m useing the Trolltech API documentation and can’t figure where I’m  
messing up.

Thanks in advance  
Frustrated of Heathfield (aka Nigel)

---

<div class="post-metadata">

**Author:** ![Nigel\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e95f7d/32.png) [@Nigel\_W](https://www.ruby-forum.com/u/Nigel_W)\
**Post date:** [November 17, 2006, 10:43pm UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361/2 "2006-11-17T22:43:34Z")

</div>

Nigel W. wrote:

> puts it.operator++()  
> /mainform.ui.rb:33:in `method_missing': undefined method`operator’ for  
> #Qt::ListViewItemIterator:0xb6c08c24 (NoMethodError)

Well, the operator ++ is meant to be called directly ++ when written  
in C++. In ruby, however, that won’t work as ++ is not an operator.  
You might want to try (untested):

p it.send(:’++’)

Cheers !

```
Vince
```

---

<div class="post-metadata">

**Author:** ![Nigel\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e95f7d/32.png) [@Nigel\_W](https://www.ruby-forum.com/u/Nigel_W)\
**Post date:** [November 18, 2006, 8:52am UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361/3 "2006-11-18T08:52:17Z")

</div>

Vincent F. wrote:

> > it = Qt::ListViewItemIterator.new(@listView)  
> > puts it.operator++()
> 
> > /mainform.ui.rb:33:in `method_missing': undefined method`operator’ for  
> > #Qt::ListViewItemIterator:0xb6c08c24 (NoMethodError)
> 
> Well, the operator ++ is meant to be called directly ++ when written  
> in C++. In ruby, however, that won’t work as ++ is not an operator.  
> You might want to try (untested):
> 
> p it.send(:’++’)  
> No, that won’t work. You need to use ‘it += 1’ instead in QtRuby:

irb(main):002:0\> lv = Qt::ListView.new  
=\> #\<Qt::ListView:0xb79e1dac name=“unnamed”, x=320, y=240, width=640,  
height=320\>  
irb(main):003:0\> item1 = Qt::ListViewItem.new(lv)  
=\> #Qt::ListViewItem:0xb79dbe70  
irb(main):004:0\> item2 = Qt::ListViewItem.new(lv)  
=\> #Qt::ListViewItem:0xb79d8180  
irb(main):005:0\> item3 = Qt::ListViewItem.new(lv)  
=\> #Qt::ListViewItem:0xb79d3054  
irb(main):006:0\> it = Qt::ListViewItemIterator.new(lv)  
=\> #Qt::ListViewItemIterator:0xb79cf620  
irb(main):007:0\> it.current  
=\> #Qt::ListViewItem:0xb79d3054  
irb(main):008:0\> it += 1  
=\> #Qt::ListViewItemIterator:0xb79cf620  
irb(main):009:0\> it.current  
=\> #Qt::ListViewItem:0xb79dbe70  
irb(main):010:0\> it += 1  
=\> #Qt::ListViewItemIterator:0xb79cf620  
irb(main):011:0\> it.current  
=\> #Qt::ListViewItem:0xb79d8180  
irb(main):012:0\> it += 1  
=\> #Qt::ListViewItemIterator:0xb79cf620  
irb(main):013:0\> it.current  
=\> nil

– Richard

---

<div class="post-metadata">

**Author:** ![Nigel\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e95f7d/32.png) [@Nigel\_W](https://www.ruby-forum.com/u/Nigel_W)\
**Post date:** [November 20, 2006, 7:25pm UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361/4 "2006-11-20T19:25:42Z")

</div>

Vincent F. wrote:

> > it = Qt::ListViewItemIterator.new(@listView)  
> > puts it.operator++()
> 
> > /mainform.ui.rb:33:in `method_missing': undefined method`operator’ for  
> > #Qt::ListViewItemIterator:0xb6c08c24 (NoMethodError)
> 
> Well, the operator ++ is meant to be called directly ++ when written  
> in C++. In ruby, however, that won’t work as ++ is not an operator.  
> You might want to try (untested):
> 
> p it.send(:’++’)  
> That will nearly work, but the method is a C++ method in the Smoke  
> library, and so it is called ‘operator++’:

mardigras rdale 504% rbqt3api Qt::ListViewItemIterator |grep operator  
QListViewItem\* QListViewItemIterator::operator\*()  
QListViewItemIterator& QListViewItemIterator::operator++()  
const QListViewItemIterator  
QListViewItemIterator::operator++(int)  
QListViewItemIterator& QListViewItemIterator::operator+=(int)  
QListViewItemIterator& QListViewItemIterator::operator–()  
const QListViewItemIterator  
QListViewItemIterator::operator–(int)  
QListViewItemIterator& QListViewItemIterator::operator-=(int)  
QListViewItemIterator& QListViewItemIterator::operator=(const  
QListViewItemI

Instead you need to do something like this:

p it.send(“operator++”.to\_sym)

I’ve just added some each methods to various Qt3 QtRuby classes, and  
made them enumerable, so you no longer need to use an external C++  
style iterator with them. This is the comment from the ChangeLog:

```
* Made Qt::ListView, Qt::ListViewItem, Qt::BoxLayout, Qt::HBoxLayout,
  Qt::VBoxLayout and Qt::GridLayout Enumerable with implementations
  of each() so they don't need to use the Qt External iterators like
  Qt::LayoutIterator anymore. For instance:

	lv = Qt::ListView.new do
		["one", "two", "three", "four"].each do |label|
			Qt::ListViewItem.new(self, label, "zzz")
		end
	end

	lv.each do |item|
		p item.inspect
		pp item.inspect
	end

* Add inspect() and pretty_print() methods to Qt::ListViewItem so that
  they show the text of their columns

```

The improvements will be in the next release of Qt3 QtRuby.

– Richard

---

<div class="post-metadata">

**Author:** ![Nigel\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e95f7d/32.png) [@Nigel\_W](https://www.ruby-forum.com/u/Nigel_W)\
**Post date:** [November 22, 2006, 8:23pm UTC](https://www.ruby-forum.com/t/qtruby-and-the-listviewitemiterator/76361/5 "2006-11-22T20:23:37Z")

</div>

On Sat, 18 Nov 2006 16:50:08 +0900  
“removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > The code snippet is
> > > 
> > > it = Qt::ListViewItemIterator.new(@listView)  
> > > puts it.operator++()
> > 
> > Well, the operator ++ is meant to be called directly ++ when  
> > written in C++. In ruby, however, that won’t work as ++ is not an  
> > operator. You might want to try (untested):
> > 
> > p it.send(:‘++’)  
> > No, that won’t work. You need to use ‘it += 1’ instead in QtRuby:

That works for me - thanks very much

Nigel
