Aplikacja okienkowa - PyQt5

0

Witam,

Zacząłem testować PyQt5 i napotkałem pewien problem. Stworzyłem przycisk, potem pasek menu u góry i wszystko fajnie działało. Postanowiłem ulepszyć przycisk o lepsze rozmieszczanie go na ekranie. Użyłem do tego importów QHBoxLayout i QVBoxLayout . Wtedy do lasy dodałem dziedziczenie z QWidget, ale miałem już dziedziczenie z QMainWindow i w żaden sposób nie chciało mi działać dziedziczenie więcej niż jednej klasy. W zależności od kolejności wpisania klas do nawiasu albo miałem błąd dziedziczenia albo wyświetlało się jedynie menu z przyciskiem w punkcie (0, 0). Postanowiłem więc zrobić to tak jak w załączonym kodzie, a więc nie dziedziczyłem klasy QMainWindow tylko stworzyłem w klasie Window obiekt tej klasy. Pasek menu jednak nadal się nie wyświetla. Może chodzi o to, żeby dodać go jakoś do layoutu, ale konstrukcja self.setLayout(menu) nie przyjmuje argumentu menu. Już skończyły mi się pomysły co do tego, a nie chce rezygnować z wygodnej opcji ustalania pozycji przycisków na ekranie dla menu. Macie jakieś pomysły jak ten problem ogarnąć?

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QAction, QHBoxLayout, QVBoxLayout, \
    QGridLayout, QMenuBar, QPlainTextEdit


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('pyqt5 Tut')

        menu = QMainWindow()

        extractAction = QAction('&Get to the choppah', self)
        extractAction.setShortcut('Ctrl+Q')
        extractAction.setStatusTip('leave the app')
        extractAction.triggered.connect(Window.close_application)

        menu.statusBar()

        mainMenu = menu.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        # helpMenu = mainMenu.addMenu('&Help')
        fileMenu.addAction(extractAction)

        self.setGeometry(400, 100, 1200, 800)

        btn = QPushButton("Wyjście", self)

        box = QHBoxLayout()
        box.addStretch(1)
        box.addWidget(btn)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(box)

        self.setLayout(vbox)

        btn.clicked.connect(self.close_application)
        # btn.resize(100, 100)

        self.show()

    def close_application(self):
        sys.exit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Window()
    sys.exit(app.exec_())
0

Window to okno, Widget to kontrolka. W ogóle nie powinieneś dziedziczyć, tylko stworzyć obiekt QWindow, dodać do niego wszystkie menu i inne rzeczy, a następnie jeszcze to okno wyświetlić (tzn. zrobić, żeby nie było ukryte). Wszystko to możesz zrobić w jednej funkcji i nie musisz deklarować żadnej klasy.

Własny widget możesz zrobić, jeżeli potrzebujesz czegoś, czego nie ma wśród standardowych kontrolek. Np. jakaś fikuśna dioda albo pokrętło.

0
haael napisał(a):

Window to okno, Widget to kontrolka. W ogóle nie powinieneś dziedziczyć, tylko stworzyć obiekt QWindow, dodać do niego wszystkie menu i inne rzeczy, a następnie jeszcze to okno wyświetlić (tzn. zrobić, żeby nie było ukryte). Wszystko to możesz zrobić w jednej funkcji i nie musisz deklarować żadnej klasy.

Własny widget możesz zrobić, jeżeli potrzebujesz czegoś, czego nie ma wśród standardowych kontrolek. Np. jakaś fikuśna dioda albo pokrętło.

Okej, rozumiem. Spróbuje tak podziałać

0

Bawisz się, czy robisz coś konkretnego?

Próbowałeś gtk? Moim zdaniem odrobinę bardziej unixowe od qt.

0

Chciałem to ogarniać w celu stworzenia właśnie konkretnego programu. Ale to też tylko po to żeby ubrać go w ładne szaty. Tak dla zachcianki :).

Nie próbowałem i tez raczej już w to nie będę wchodził dla tego jednego programu

1 użytkowników online, w tym zalogowanych: 0, gości: 1