Widget wird nicht angezeigt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
agressor
User
Beiträge: 9
Registriert: Donnerstag 1. September 2011, 05:23

Der unfähige mal wieder.v :oops:

Ich habe jetzt mit hilfe eines Tutorials eine Klasse geschrieben, die etwas zeichnen kann...
wenn ich entsprechend dieses Tutorials das ganze mittels "QGridLayout" in ne GUI einfüge is alles super. Das funktioniert problemfrei. auch QBoxLayout funktioniert fast gut (setGeometry hat keine funktion???)
Mit dem Grid lässt sich jedoch nur schwer meine gewünschte GUI realisieren.

ich will diese Klasse in meine bestehende GUI einfügen
wenn ich das aber dann einfügen will wird es nicht angezeigt, Es gibt allerdings auch keine fehlermeldung.
sowohl elemente davor als auch danache werden angezeigt und funktionieren wie gewünscht. Nur meine Klasse wird nicht angezeigt.

Funktionierender Code

Code: Alles auswählen

    app = QApplication(sys.argv)
    form = QDialog()

    slider = FractionSlider(12)
        
    B_Verbinden = QPushButton()
    B_Verbinden.setObjectName("B_Verbinden")
    B_Verbinden.setText("Verbinden")
    
    layout = QBoxLayout(0,None)

    layout.addWidget(slider)
    layout.addWidget(B_Verbinden)

    form.setLayout(layout)

    form.setWindowTitle("Fraction Slider")
    form.show()
    app.exec_()
Stellt die Elemente einfach nebeneinander dar, ohne chance auf Positionieren.

...und diese Version hätte ich gerne am funktionieren.

Code: Alles auswählen

    
        [...]
        def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(698, 532)
        self.B_Verbinden = QPushButton(self)
        self.B_Verbinden.setGeometry(QRect(150, 190, 151, 41))
        self.B_Verbinden.setObjectName("B_Verbinden")
        self.fractionslider = FractionSlider(denominator=12)
        self.fractionslider.setGeometry(QRect(250, 180, 100, 171))
        self.fractionslider.setObjectName("FractionSlider")
        print ("Jetz sollte der eigentlich da sein")

        [...]

app = QApplication(sys.argv) 
dialog = MeinWidget() 
dialog.show() 
print "test"
sys.exit(app.exec_())

der Button und wasnich wird eingefügt... aber der FractionSlider nich

Die Klasse ist folgendermaßen aufgebaut:

Code: Alles auswählen

class FractionSlider(QWidget):

     def __init__(self, numerator=0, denominator=10, parent=None):
        super(FractionSlider, self).__init__(parent)
        self.__numerator = numerator
        self.__denominator = denominator
        self.setFocusPolicy(Qt.WheelFocus)
        self.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding,
                                       QSizePolicy.Fixed))

    def minimumSizeHint(self):
        font = QFont(self.font())
        font.setPointSize(font.pointSize() - 1)
        fm = QFontMetricsF(font)
        return QSize(fm.width(FractionSlider.WSTRING) *
                     self.__denominator,
                     (fm.height() * 4) + FractionSlider.YMARGIN)

    def paintEvent(self, event=None):
        [...]
is natürlich etwas gekürzt

mal wieder bitte ich um Hilfe bei der lösung des Problems oder wenigstens einer erklährung warum es nicht funktionieren kann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Auch wenn Du Dir wohl Mühe gemacht hast, Dein Problem zu beschreiben und mit Code-Schnipseln zu belegen: Ich kann daraus nur wenig verstehen!

Wieso willst Du auf einen LayoutManager verzichten? Imho keine gute Idee.

In Deiner `setupUi` stimmt die Einrückung schon mal nicht. Davon abgesehen besteht zwischen Deiner eigenen Klasse (sofern das diese FractionSlider-Klasse ist, denn explizit wird das von Dir nie erklärt!) keinerlei Beziehung zum MainWindow! Normalerweise kann man das über den Parameter `parent` erreichen.

Bei der Verwendung eines Layoutmanagers braucht man die `show`-Methode eines QWidgest nicht aufrufen; ich weiß nicht, ob der das intern für seine Kinder selber erledigt. Evtl. wäre das also zusätzlich noch erforderlich.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

@agressor: Absolute Größenangaben sind ein No-Go bei graphischen Benutzeroberflächen. Verwende Layouts.

Zum Problem: Dich sollte nicht wundern, dass das Steuerelement nicht angezeigt wird, hast Du es doch unterlassen, ihm bei der Erzeugung das richtige "parent"-Widget mitzugeben. Das Steuerelement weiß mithin gar nicht, wo es angezeigt werden soll.

Deine Problembeschreibung ist zwar ausführlich, aber unstrukturiert, und mitunter schlicht konfus. Zeige in Zukunft doch bitte vollständige, ungekürzte, aber bitte minimale Quelltextbeispiele, und bitte mit korrekter Einrückung.

@Hyperion: Ein expliziter Aufruf von ".show()" ist nicht nötig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben: @Hyperion: Ein expliziter Aufruf von ".show()" ist nicht nötig.
Ah... danke, gut dass der "Godfather of Qt" hier regelmäßig aktiv ist :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
agressor
User
Beiträge: 9
Registriert: Donnerstag 1. September 2011, 05:23

Ok...
Danke für die Antwort. Mit dem zusätzlichen Parameter "parent=self" wird es jetzt eingefügt.

Bin halt kein Softwerker. ich habe meine finger an mechanik, elektronik und selten mal an ner firmware mit nem kastrierten BASIC
Antworten