[PyQt] findChildren: setting visibility problems

Marcus Ottosson konstruktion at gmail.com
Mon Oct 13 20:25:46 BST 2014


Just a small tip, there’s a plug-in for chrome and firefox that does code
highlighting in emails and google groups.

   - http://markdown-here.com/

It looks like this:

import sysfrom PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        vbox = QtGui.QVBoxLayout()
        gb = QtGui.QGroupBox()

        button = QtGui.QPushButton("Hide")
        button.clicked.connect(self.toggle)

        vbox.addWidget(button)

        lbl = QtGui.QLabel("Test Label")
        vbox.addWidget(lbl)

        gbLayout = QtGui.QFormLayout()
        lbl1 = QtGui.QLabel("Hello", gb)
        gbLayout.addWidget(lbl1)

        le1 = QtGui.QLineEdit(gb)
        gbLayout.addWidget(le1)

        gb.setLayout(gbLayout)
        vbox.addWidget(gb)

        gb.setTitle("Test")
        self.setLayout(vbox)

        self.show()

    def toggle(self):

       self.l = self.findChildren((QtGui.QGroupBox, QtGui.QLabel))
       print self.l
       for i in self.l:
         i.setVisible(not i.isVisible())
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

​

On 13 October 2014 20:12, Chris Wood <c.c.wood at gmail.com> wrote:

> I've found that where I have a QLabel as a child of my QWidget, and a
> QLabel which is a child of a QGroupBox which is a child of my QWidget, and
> I toggle the visibility of all the children of the QWidget via the click
> action of a button:
>
> def toggleVis(self):
>   self.results = findChildren((QLabel,QGroupBox))
>   print self.results
>   for w in self.results:
>     w.setVisible(not w.isVisible())
>
> After hiding the objects initially, and clicking the button again, the
> QLabel which is a child of the QGroupBox does not reappear, but all 3
> objects are listed when self.results is printed (full code at end of
> email).  I expected this to work, since findChildren is recursive.
> However, it *does* work if I reverse the list (for w in
> reverse(self.results)).  I get the same behaviour on both Unix (Fedora 20)
> and Windows 7. Is this documented? Perhaps a different way round this would
> be to specify names (I could probably use some regex to ensure I capture
> the objects I want), but wanted to make sure I hadn't missed something
> obvious from the docs first...
>
> Cheers,
> Chris
>
> ------
>
> import sys
> from PyQt4 import QtGui, QtCore
>
> class Example(QtGui.QWidget):
>
>     def __init__(self):
>         super(Example, self).__init__()
>         vbox = QtGui.QVBoxLayout()
>         gb = QtGui.QGroupBox()
>
>         button = QtGui.QPushButton("Hide")
>         button.clicked.connect(self.toggle)
>
>         vbox.addWidget(button)
>
>         lbl = QtGui.QLabel("Test Label")
>         vbox.addWidget(lbl)
>
>         gbLayout = QtGui.QFormLayout()
>         lbl1 = QtGui.QLabel("Hello", gb)
>         gbLayout.addWidget(lbl1)
>
>         le1 = QtGui.QLineEdit(gb)
>         gbLayout.addWidget(le1)
>
>         gb.setLayout(gbLayout)
>         vbox.addWidget(gb)
>
>         gb.setTitle("Test")
>         self.setLayout(vbox)
>
>         self.show()
>
>     def toggle(self):
>
>        self.l = self.findChildren((QtGui.QGroupBox, QtGui.QLabel))
>        print self.l
>        for i in self.l:
>          i.setVisible(not i.isVisible())
>
> if __name__ == '__main__':
>     app = QtGui.QApplication(sys.argv)
>     ex = Example()
>     sys.exit(app.exec_())
>
>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>



-- 
*Marcus Ottosson*
konstruktion at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20141013/449556f4/attachment-0001.html>


More information about the PyQt mailing list