Re: Re: [Kde-java] KListViewItem problems

list at maikschulz.de list at maikschulz.de
Mon Jun 7 11:12:02 CEST 2004


Hi Richard,

thanks a lot! Writing example code is a great way to get myself started
on learning the KDE/Qt API, and if I can help fix a bug or two along
the way, all the better!

Regards,
-Maik

Richard Dale <Richard_Dale at tipitina.demon.co.uk> schrieb am 07.06.2004,
10:39:46:
> On Monday 07 June 2004 01:16, Maik Schulz wrote:
> > On Sunday 06 June 2004 20:28, Richard Dale wrote:
> > > Please can you post full example code with suitable test cases so this
> > > can be run and tried out? The example above is much too complex to just
> > > read the source and 'think about it'.
> > >
> > > But I would be surprised if the java bindings managed to change the
> > > semantics of KListViewItem insertion into a KListView.
> > >
> > > -- Richard
> > > _______________________________________________
> > > Kde-java mailing list
> > > Kde-java at kde.org
> > > https://mail.kde.org/mailman/listinfo/kde-java
> >
> > Hi Richard,
> >
> > took me a while, but here goes the code. The comments in the code explain
> > what works and what doesn't.
> Thanks for the example code. It took me a while to work out what's going on, 
> but the problem is that since KDE 3.2 'copy constructor' methods have been 
> generated for classes which didn't have them in C++. KListViewItem has one of 
> these constructors:
> 
> 	public KListViewItem(KListViewItem arg1) {
> 		super((Class) null);
> 		newKListViewItem(arg1);
> 	}
> 	private native void newKListViewItem(KListViewItem arg1);
> 
> But in the original klistview.h header, there is on such method - all the 
> constructors take QListViewItems rather than KListViewItem. In this line:
> 
>             KListViewItem item3 = new KListViewItem(item0);
> 
> The copy constructor is called, and item3 becomes a copy of item0 instead of 
> having item0 as its parent. 
> 
> On the other hand, this call works because firstChild() is a QListViewItem, 
> not a KListViewItem and the correct constructor is called:
> 
>             KListViewItem item3 = new KListViewItem(kListView.firstChild());
> 
> The work round is to cast to a QListViewItem:
>             KListViewItem item3 = new KListViewItem((QListViewItem) item0);
> 
> I think the best thing is to not generate these extra constructors as they're 
> more trouble than they're worth. I'll do that for KDE 3.3.
> 
> Other Issues:
> 
> Sorting is turned on be default, so you need a line like this:
> 		kListView.setSorting(-1);
> 
> 
>         public void buttonClicked() {
> //I have to use QListViewItem because casting to KListViewItem throws
> //a CLASSCASTEXCEPTION. Why is that? I only used KListViewItems...
>                 QListViewItem selectedItem = kListView.selectedItem();
> 
> The reason for this problem is that there were no java references to the 
> KListViewItem, and the original java instance was garbage collected.
> However, because it was 'owned' by the KListView, the underlying C++ instance 
> wouldn't have been deleted. 
> 
> Then when you reference the listviewitem via selectedItem(), the qtjava 
> runtime finds there is no corresponding java instance anymore for the C++ 
> one. It then creates another java wrapper instance of type 'QListViewItem'. 
> This is because KListViewItem doesn't reimplement the rtti() method, and 
> there is no way of telling whether it is a QListViewItem or a KListViewItem.
> 
> The solution is to either put the listviewitems into an ArrayList as they're 
> created and avoid gc:
> 
> 	ArrayList itemList = new ArrayList();
> 	...
> 		itemList.add(item0);
> 	...
> 		itemList.add(item3);
> 
> Or use Qt.dynamicCast() to cast back to the correct type:
> 
>                 QListViewItem selectedItem = 
> Qt.dynamicCast("org.kde.koala.KListViewItem", kListView.selectedItem());
> 
> Anyway, thanks very much for the bug report and example. I've also found that 
> the QtRuby bindings have the same problem (and probably PertQt too), because 
> that's where I got the code for generating the extra copy constructors from.
> 
> -- Richard
> 
> 
> 
> _______________________________________________
> Kde-java mailing list
> Kde-java at kde.org
> https://mail.kde.org/mailman/listinfo/kde-java


More information about the Kde-java mailing list