Sichtbarkeit von sichtbaren QWidgets ist "False"

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo

Mit dem folgenden Code erscheinen 3 `QPushButton`s in einem `QMainWindow`. Die Sichtbarkeit der `QPushButton` wird zusätzlich noch explizit auf "True" gesetzt. Trotzdem gibt die Methode `isVisible()` von jedem `QPushButton` ein "False" zurück.

Warum wird ein "False" zurückgegeben und kein "True"?

main.py

Code: Alles auswählen

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        loadUi("mainwindow.ui", self)
        buttons = (self.pushButton_left, self.pushButton_middle, self.pushButton_right)

        for button in buttons:
            button.setVisible(True)
            print(button.isVisible())


def main():
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

mainwindow.ui

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>500</width>
    <height>200</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QPushButton" name="pushButton_left">
      <property name="locale">
       <locale language="English" country="UnitedKingdom"/>
      </property>
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QPushButton" name="pushButton_middle">
      <property name="locale">
       <locale language="English" country="UnitedKingdom"/>
      </property>
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
    <item row="0" column="2">
     <widget class="QPushButton" name="pushButton_right">
      <property name="locale">
       <locale language="English" country="UnitedKingdom"/>
      </property>
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>500</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
Gruß
Atalanttore
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zu dem Zeitpunkt ist dein Fenster ja noch nicht dargestellt. Und somit das Widget nicht sichtbar. Was auch kristallklar in der Methodendoku dazu steht: https://doc.qt.io/qt-5/qwidget.html#visible-prop
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Calling setVisible(true) or show() sets the widget to visible status if all its parent widgets up to the window are visible.
Mit "parent widgets" ist dann wohl das `QMainWindow` gemeint.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da alle Widgets entweder toplevel sind (Fenster, Dialoge) oder irgendwo unterhalb anderer Widgets hängen - ja.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Danke für die Antwort. Bezeichnet man Fenster und Dialoge allgemein als "toplevel" Widgets oder ist das nur bei Qt so?

Gruß
Atalanttore
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da es in Tk auch so ist, wuerde ich das als allgemeines Konzept ansehen. So oder so ist es eben das: eine Anwendung hat eine bestimmte Anzahl (mindestens eines, wenn wir mal sowas wie minimiertes laufen/systrays etc aussen vorlassen) von unterschiedlichen Fenstern auf. Und nichts was sie malt malt sie ausserhalb dieser.
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Um noch einen Datenpunkt hinzuzufügen: Auch in Gtk wird die Bezeichnung „toplevel widgets“ äquivalent verwendet. Wobei ich mich nicht wundern würde wenn alle die Bezeichnung von X11 übernommen haben.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__ & __blackjack__: Danke für die Erklärungen.

Gruß
Atalanttore
Antworten