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: 14543
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: 14543
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: 14543
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: 13116
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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

Gruß
Atalanttore
Antworten