Seite 1 von 1

Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Sonntag 24. November 2019, 16:17
von Atalanttore
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

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Sonntag 24. November 2019, 16:54
von __deets__
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

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Sonntag 24. November 2019, 19:15
von Atalanttore
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.

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Sonntag 24. November 2019, 19:17
von __deets__
Da alle Widgets entweder toplevel sind (Fenster, Dialoge) oder irgendwo unterhalb anderer Widgets hängen - ja.

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Montag 25. November 2019, 16:09
von Atalanttore
@__deets__: Danke für die Antwort. Bezeichnet man Fenster und Dialoge allgemein als "toplevel" Widgets oder ist das nur bei Qt so?

Gruß
Atalanttore

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Montag 25. November 2019, 16:46
von __deets__
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.

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Montag 25. November 2019, 17:50
von __blackjack__
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.

Re: Sichtbarkeit von sichtbaren QWidgets ist "False"

Verfasst: Montag 25. November 2019, 21:34
von Atalanttore
@__deets__ & __blackjack__: Danke für die Erklärungen.

Gruß
Atalanttore