• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Praca z PyQt5 - dużo pytań

VPS Starter Arubacloud
+1 głos
978 wizyt
pytanie zadane 14 września 2017 w Python przez lukaszvip166 Początkujący (300 p.)
Witam.

Zacząłem zabawę z PyQt5. Mam w planie napisanie aplikacji dla własnego użytku, dotyczącej statystyk wędkarskich. Stworzyłem sobie prosty toolbar i teraz mam pytanie do Was. Jak zrobić, żeby po kliknięciu na ikonę przełączyć do innego okna? Oczywiście będę miał dużo więcej pytań :)

Z góry dziękuję za pomoc.

2 odpowiedzi

+2 głosów
odpowiedź 16 września 2017 przez adrian313 Bywalec (2,850 p.)
wybrane 17 września 2017 przez lukaszvip166
 
Najlepsza

Nawiązując do poprzedniego posta i zgodnie z prośbą lukaszvip166 rozpisuję jak to się dzieje w przykładzie:

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)
        login_widget = LoginWidget(self)
        login_widget.button.clicked.connect(self.login)
        self.central_widget.addWidget(login_widget)
    def login(self):
        logged_in_widget = LoggedWidget(self)
        self.central_widget.addWidget(logged_in_widget)
        self.central_widget.setCurrentWidget(logged_in_widget)

W klasie MainWindow przy jej tworzeniu ( def __init__(self, parent = None) )

  1. funkcja super tworzy obiekt klasy MainWindow jako QMainWindow
  2. self.central_wigdet - ustawia główny(centralny) widget jako QStacketWidget
  3. środkuje ten widget
  4. następnie tworzona jest instancja klasy LoginWidget
  5. ustawia listener "na kliknięcie" -> funckje login(self)
  6. no i dodaje widget login_widget do widoku patrz pkt 2, 3

Funkcja login(self)

  1. zmienna logged_in_widget wskazuje na obiekt klasy LoggedWidget
  2. dodaje widget logged... do (patrz punkt 2, 3 metody __init__)
  3. ustawia teraz wyświetlany widget na logged...()
class LoginWidget(QWidget):
    def __init__(self, parent=None):
        super(LoginWidget, self).__init__(parent) # tworzy widget
        layout = QHBoxLayout() #ustawia layout
        self.button = QPushButton('Login') #definiuje przycisk
        layout.addWidget(self.button) #dodaje do layoutu
        self.setLayout(layout) #ustawia przycisk
        # you might want to do self.button.click.connect(self.parent().login) here
 
 
class LoggedWidget(QWidget):
    def __init__(self, parent=None):
        super(LoggedWidget, self).__init__(parent)# tworzy widget
        layout = QHBoxLayout() #ustawia layout
        self.label = QLabel('logged in!') #definiuje pole
        layout.addWidget(self.label) #dodaje je
        self.setLayout(layout) #ustawia layout

 

0 głosów
odpowiedź 15 września 2017 przez adrian313 Bywalec (2,850 p.)

Działający przykład w PyQt5:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import *
import sys


class Second(QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.pushButton = QPushButton("click me")

        self.setCentralWidget(self.pushButton)

        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialog = Second(self)

    def on_pushButton_clicked(self):
        self.dialog.show()


def main():
    app = QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

 

komentarz 15 września 2017 przez lukaszvip166 Początkujący (300 p.)
Ok :) Dzięki za przykład, ale on otwiera nowe okno :) a ja chciałbym, żeby po kliknięciu na ikone menu nowy obraz powstał w tym samym oknie :) żeby odświeżył się widok.
komentarz 15 września 2017 przez adrian313 Bywalec (2,850 p.)

Napisałeś: przełączyć do innego okna ;] 
w każdym razie zmiana widoku okna:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import *
import sys

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.central_widget = QStackedWidget()
        self.setCentralWidget(self.central_widget)
        login_widget = LoginWidget(self)
        login_widget.button.clicked.connect(self.login)
        self.central_widget.addWidget(login_widget)
    def login(self):
        logged_in_widget = LoggedWidget(self)
        self.central_widget.addWidget(logged_in_widget)
        self.central_widget.setCurrentWidget(logged_in_widget)


class LoginWidget(QWidget):
    def __init__(self, parent=None):
        super(LoginWidget, self).__init__(parent)
        layout = QHBoxLayout()
        self.button = QPushButton('Login')
        layout.addWidget(self.button)
        self.setLayout(layout)
        # you might want to do self.button.click.connect(self.parent().login) here


class LoggedWidget(QWidget):
    def __init__(self, parent=None):
        super(LoggedWidget, self).__init__(parent)
        layout = QHBoxLayout()
        self.label = QLabel('logged in!')
        layout.addWidget(self.label)
        self.setLayout(layout)



if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

 

komentarz 15 września 2017 przez lukaszvip166 Początkujący (300 p.)
Dzięki :)

Teraz jestem w 100% usatysfakcjonowany :)

Umiejętność otwierania nowego okna też się przyda :)

Podobne pytania

+24 głosów
8 odpowiedzi 1,574 wizyt
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 21 listopada 2018 w Python przez niezalogowany
0 głosów
0 odpowiedzi 92 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...