Seconded there. If you are writing raw Qt UI I'd stick with it without exiting that "scope". As for the complexity of your sample code, that seems completely reasonable to me.
You could also subclass QListWidgetItem (not sure if that's the actual class name...) and handle a lot of the customization there. For instance, you could override its __str__ method to return the text attribute, allowing you to print these items directly, or handle them as strings under certain circumstances.
ex:
print my_itemtype_instance
Also, I think this *should* work:
print " ".join(my_itemtype_instance_array)
At any rate, the examples are not the best, and I'd probably never do that:), but I think you're on the right track. Writing UI code is complex and relatively voluminous when compared with other types of coding. For every line of UI code you don't write, you are giving up some amount of control, and buying into someone else's idea of what is acceptable in terms of performance and behavior. If you handle this on your end, you will end up with more code, but you will be able to form it as you need in your particular use case.
-Judah