[PyKDE] ListBoxItems are invisible

John Ridley ojokimu at yahoo.co.uk
Wed Mar 30 20:11:51 BST 2005


--- Jeffrey Barish <jeff_barish at earthlink.net> wrote:
> I hope that someone can explain something to me.  In the following
> code
> sample, I expect to see 3 lines of text in a listbox.  When I
> uncomment
> the line that is commented out and comment out the 2 lines above it,
> I
> get the expected result.  With the code as shown, I get a listbox,
> but
> no text is visible in it.  In both case, however, the print loop
> confirms that there are 3 lines of text and the text is what was set.
> 
> So why don't I see anything with the code as shown?  Is there a way
> to
> make the text visible when I put it in a QListBoxItem?  When working
> with a QListViewItem, it works to create a QListViewItem and then set
> its text (in fact, one must because unlike QListBox.insertItem,
> QListView.insertItem does not accept a text argument).  Why does it
> work with views but not boxes?
> 
> Incidentally, when I first wrote this sample, I had 
> 
> self.insertItem(lbi, -1)
> 
> after the two lines in question.  In that case, I wound up with 6
> lines
> of text, and the last 3 were all "some text 2".  What I believe I was
> supposed to learn is that the constructor for QListBoxItem connects
> the
> resulting lbi to the parent specified, so the insertItem was making
> redundant connections.  I'm not clear on why the lines of text were
> numbered 0, 1, 2, 2, 2, 2 (rather than 0, 0, 1, 1, 2, 2), but what I
> really want to know is what insertItem(lbi) is properly used for.  I
> suppose it must be for situations in which the lbi being inserted has
> a
> different parent, but I can't imagine such a situation.

QListBox.insertItem allows you to insert items which have no parent
(see below), or to re-insert items which have been removed using
QListBox.takeItem. 

> import sys
> from qt import *
> 
> class MainWindow(QMainWindow):
>     def __init__(self, *args):
>         QMainWindow.__init__(self, *args)
> 
>         self.mlb = MyListBox(self)
>         self.setCentralWidget(self.mlb)
> 
> class MyListBox(QListBox):
>     def __init__(self, parent):
>         QListBox.__init__(self, parent)
>         for i in range(3):
>             lbi = QListBoxItem(self)
>             lbi.setText("some text %d" % i)
> ##            self.insertItem("some text %d" % i, -1)


Replace the above loop with the one below and things should work
nicely.

        for i in range(3):
            lbi = QListBoxText("some text %d" % i)
            self.insertItem(lbi)

Note that QListBoxItem is an abstract base class designed for the
creation of custom listbox items, so I have used QListBoxText instead.
This class can also be given a parent listbox in the constructor,
making the above insertItem call redundant:

        for i in range(3):
            lbi = QListBoxText(self, "some text %d" % i)


Hope this is of some help to you!

--
John Ridley


>         for i in range(self.count()):
>             print "text at position", i, self.text(i)
> 
> def main(args):
>     app = QApplication(args)
>     win = MainWindow()
>     app.setMainWidget(win)
>     win.show()
>     app.connect(app, SIGNAL("lastWindowClosed()"), app,
> SLOT("quit()"))
>     app.exec_loop()
> 
> if __name__ == "__main__":
>     main(sys.argv)
> 
> -- 
> Jeffrey Barish
> 
> _______________________________________________
> PyKDE mailing list    PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
> 

Send instant messages to your online friends http://uk.messenger.yahoo.com 




More information about the PyQt mailing list