PyQT5

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

Hallo,

da ich die letzten Jahre mit C++ gewerkelt habe und daher bereits QT kenne, wollte ich jetzt mal PyQT5 benutzen, da dies um Längen angenehmer ist.
Ich habe mir jetzt erstmal einen einfachen Test Code zum erstellen eines Fensters mit Button geschrieben.

Code: Alles auswählen

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initME()

    def initME(self):
        self.setGeometry(5, 5, 800, 600)
        self.setWindowTitle("GUI")
        self.show()
        button = QPushButton("Schließen", self)
        button.move(100, 100)



app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
Allerdings zeigt es mir keinen Button an. Woran kann das liegen?

Danke Lou
PS: Wie kann ich unter Linux den Designer für PyQt öffnen?
Cours, camarade, le vieux monde est derrière toi!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sollte unter C++ nicht anders sein - du fuegst ein Widget *nach* dem sichtbar machen des Fensters hinzu, und damit wird das neue Widget nicht angezeigt, weil sein Zustand noch unsichtbar ist.

Du sollest show also als letztes aufrufen.

Und ich hoffe, du benutzt nicht im fertigen Programm nicht feste Positionen, sondern das wirklich recht gelungene Layout-System?
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

@__deets__ Ah danke das hab ich wohl übersehen.

Ich benutze das gerade alles nur privat.
Das layout system kenn ich nur vom qt designer apropos wie kann ich den unter linux öffnen? pyqt5-tools ist installiert
Cours, camarade, le vieux monde est derrière toi!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oeh, was hat privat damit zu tun?

Wie dem auch sei - den designer muss man auch explizit installieren, qttools5-dev-tools oder so.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

aber meintest du den mit layout system?
Cours, camarade, le vieux monde est derrière toi!
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lou Cyphr3: Layouts: https://doc.qt.io/qt-5/layout.html

Was soll die `initME()`-Methode? Irgendwelche C++-spezifischen Gründe das nicht in den Konstruktor zu schreiben, sollte man nicht in andere Programmiersprachen übernehmen.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

@ __blackjack__

Danke erstmal für den link. Ich kenne dieses Konzept bereits aus C++ und es ist total sinnvoll.
Was ich mich noch Frage ist PyQt eigentlich ein standalone oder einfach nur ne Portierung des normalen Qt?
Weil der Beispielcode auch nur in C++ vorliegt.

Zu der Methode, meinst ich solle alles direkt in den Konstruktor schreiben und die Methode weglassen?
Cours, camarade, le vieux monde est derrière toi!
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lou Cyphr3: PyQt ist weder eigenständig noch eine Portierung, das ist ein Wrapper um die C++-API. Das wäre ja schon ziemlich irre komplett Qt noch mal in einer anderen Programmiersprache zu schreiben. Zumal man da ja auch mit reinem Python eher nicht zum Ziel käme und Teile in C oder C++ schreiben müsste.

Die `__init__()` ist dazu da das Objekt zu initialisieren. Also ja, da sollte der Code drin stehen der das Objekt initialisiert. Welchen Sinn hat das da nur zwei Zeilen drin zu haben und die eigene Initialisierung in eine weitere Methode zu schreiben?

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Antworten