QTabWidget: Wie Tabwechsel erkennen (welcher ist angeklickt worden)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

Hallo Zusammen,

ich bin ganz neu hier im Forum und habe trotz Forumsuche und Googlesuche zu folgendem Problem keine Lösung gefunden:

Mit dem kleinen Codeblock möchte ich auf eine UI erstellt in QT5 zugreifen. Das funktioniert und ich habe es auch hinbekommen,
dass wenn ich auf den Button klicke, das Textfeld mit Text gefüllt wird.
Was ich jedoch nicht hinbekomme ist, dass ich auf einen Tabwechsel reagieren kann. (Im Code als Beispiel Kunden, Lieferanten, Lager)
Könnte mir hier jemand zeigen, wie das geht? Wie muss der Code aussehen?
Über eine Hilfestellung würde ich mich sehr freuen.
Hier ist der Code und die Ui

Code: Alles auswählen

 from PyQt5 import QtWidgets, uic, QtCore, QtGui
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTabWidget
import sys

class Ui(QtWidgets.QMainWindow):

    def buttonKlick(self):
        self.testlabel.setText("Es hat geklappt")
        print('Input text: ' + self.input.text())


    def __init__(self):

        super(Ui, self).__init__()
        uic.loadUi(r'C:\Users\MainWindow.ui', self)

        self.button = self.findChild(QtWidgets.QPushButton,'ExcelTabelleErstellen')
        self.button.clicked.connect(self.buttonKlick)
        self.input = self.findChild(QtWidgets.QLabel,'testlabel')
        self.tabDRGReport = self.findChild(QtWidgets.QWidget,"tabLieferanten")
        self.show()

app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()
Und hier die Ui mit Qt5 erstellt:

Code: Alles auswählen

 <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Hauptprogramm</class>
 <widget class="QMainWindow" name="Hauptprogramm">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1280</width>
    <height>960</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QTabWidget" name="tabWidget">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>1091</width>
      <height>851</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
      <underline>true</underline>
     </font>
    </property>
    <property name="currentIndex">
     <number>2</number>
    </property>
    <widget class="QWidget" name="tabKunden">
     <attribute name="title">
      <string>Kunden</string>
     </attribute>
     <widget class="QPushButton" name="ExcelTabelleErstellen">
      <property name="geometry">
       <rect>
        <x>10</x>
        <y>30</y>
        <width>211</width>
        <height>41</height>
       </rect>
      </property>
      <property name="font">
       <font>
        <family>Arial</family>
        <pointsize>10</pointsize>
       </font>
      </property>
      <property name="text">
       <string>ExcelDatei erstellen</string>
      </property>
     </widget>
     <widget class="QLabel" name="testlabel">
      <property name="geometry">
       <rect>
        <x>240</x>
        <y>40</y>
        <width>161</width>
        <height>31</height>
       </rect>
      </property>
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </widget>
    <widget class="QWidget" name="tabLieferanten">
     <attribute name="title">
      <string>Lieferanten</string>
     </attribute>
    </widget>
    <widget class="QWidget" name="tabLager">
     <attribute name="title">
      <string>Lager</string>
     </attribute>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1280</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>ExcelTabelleErstellen</sender>
   <signal>windowIconTextChanged(QString)</signal>
   <receiver>testlabel</receiver>
   <slot>setText(QString)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>231</x>
     <y>80</y>
    </hint>
    <hint type="destinationlabel">
     <x>346</x>
     <y>84</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>
Ich würde mich riesig freuen, wenn mir jemand helfen könnte.
Schön wäre es mit einem Codebeispiel.

Schon mal vielen Dank für Eure Hilfe.

Viele Grüße
Michael
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Michael202007: `QTabWidget` hat ein `currentChanged()`-Signal. Wird auch in der Beschreibung von `QTabWidget` in der Qt-Dokumentation erwähnt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

__blackjack__ hat geschrieben: Dienstag 21. Juli 2020, 19:46 @Michael202007: `QTabWidget` hat ein `currentChanged()`-Signal. Wird auch in der Beschreibung von `QTabWidget` in der Qt-Dokumentation erwähnt.
Hallo blackjack,

vielen Dank für Deine Nachricht.

Dieses 'curretChanged() - Signal habe ich auch gelesen.
Nur bekomme ich es nicht hin.
Kannst Du mir bitte zeigen, wie das geht? Bei dem Button habe ich es hinbekommen aber bei dem Tab-Wechsel schaffe ich es nicht.

Würde mich sehr freuen, wenn Du mir helfen könntest.

Vielen Dank für Deine Hilfe.
Michael
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Als erstes solltest Du mal diese umständlichen `findChild()`-Aufrufe loswerden. `uic.loadUi()` setzt bereits Attribute auf dem übergebenen Objekt, also `self`. Da ”castest” Du nämlich unsinnigerweise das `QTabWidget` zu einem `QWidget`. Würde mich nicht wundern wenn dabei die spezifischen Attribute eines `QTabWidget` nicht mehr verfügbar sind.

Und dann zeig doch mal was Du versucht hast und beschreib was Du erwartet hast und wo und wie das Programm dann von Deiner Erwartung abgewichen ist. Falls auf der Konsole eine Fehlermeldung ausgegeben wurde, die 1:1 zeigen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

Hallo Zusammen,

über eine Hilfestellung, da ich Anfänger bin, würde ich mich sehr freuen.

Vielen Dank für Eure Mühe und Hilfestellung.

Viele Grüße
Michael
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Michael202007: Nochmal: Lass diesen `findChild()`-Kram weg und verwende die Attribute die es bereits gibt. Und dann zeig was beim verbinden vom `currentChanged()`-Signal nicht funktioniert hat.

Wo hast Du das mit dem `findChild()` überhaupt her? `loadUi()` setzt die Widgets als Attribute auf dem Objekt das da als Argument übergeben wird unter dem Namen der im Designer vergeben wurde. Da möchtest Du vielleicht die Namen ändern, so dass die dem entsprechen was Du auch im Programm verwenden willst. Und eventuell auch einer Namenskonvention anpassen, denn `ExcelTabelleErstellen` entspricht ja weder der Python- noch der Qt-Konvention. Das wäre in beiden der Name einer Klasse, wenn man nach der Schreibweise geht. Inhaltlich scheint es dagegen eine Funktion oder Methode zu beschreiben, denn es ist eine Tätigkeit.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

__blackjack__ hat geschrieben: Dienstag 21. Juli 2020, 21:56 @Michael202007: Nochmal: Lass diesen `findChild()`-Kram weg und verwende die Attribute die es bereits gibt. Und dann zeig was beim verbinden vom `currentChanged()`-Signal nicht funktioniert hat.

Wo hast Du das mit dem `findChild()` überhaupt her? `loadUi()` setzt die Widgets als Attribute auf dem Objekt das da als Argument übergeben wird unter dem Namen der im Designer vergeben wurde. Da möchtest Du vielleicht die Namen ändern, so dass die dem entsprechen was Du auch im Programm verwenden willst. Und eventuell auch einer Namenskonvention anpassen, denn `ExcelTabelleErstellen` entspricht ja weder der Python- noch der Qt-Konvention. Das wäre in beiden der Name einer Klasse, wenn man nach der Schreibweise geht. Inhaltlich scheint es dagegen eine Funktion oder Methode zu beschreiben, denn es ist eine Tätigkeit.
Danke für Deine Antwort.

Leider weis ich nicht, wie ich das Verbinden mit dem 'currentChanged()-Signal machen soll.
Ich habe im Moment auch keine Idee...
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Michael202007: Also Du weist wie das bei einem `QPushbutton` geht, aber bei einem `QTabWidget` nicht‽

In der PyQt5-Dokumentation steht allgemein etwas im „Support for Signals and Slots“-Abschnitt. Und in der Qt-Dokumentation gibt es einen Abschnitt „Signals and Slots“ der das Konzept erklärt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

__blackjack__ hat geschrieben: Dienstag 21. Juli 2020, 22:32 @Michael202007: Also Du weist wie das bei einem `QPushbutton` geht, aber bei einem `QTabWidget` nicht‽

In der PyQt5-Dokumentation steht allgemein etwas im „Support for Signals and Slots“-Abschnitt. Und in der Qt-Dokumentation gibt es einen Abschnitt „Signals and Slots“ der das Konzept erklärt.
Deshalb hatte ich ja auch um ein Code - Beispiel gebeten und den bereits vorhandenen Code von mir beigefügt.

Es wäre toll, wenn mir hier jemand einfach nur eine Hilfestellung geben könnte... (EIN BEISPIEL, wie es richtig geht)

Vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Michael202007: Also ich bin dann hier raus wenn Du nicht ein bisschen eigene Leistung zeigen magst. Du weisst ja anscheinend schon wie das bei einem `QPushbutton` geht. Bei einem `QTabWidget` geht das grundsätzlich genau so. Ein Beispiel hast Du also bereits. Und allgemein wird es in den beiden genannten Dokumentationen beschrieben.

Beim Transfer des Wissens von dem Signal beim Button kann es zu Problemen kommen, aber dann zeig die mal bitte konkret. Also was Du gemacht hast, und was dabei dann ganz konkret nicht funktioniert. Also den Code und die Fehlermeldung die Du da bekommst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michael202007
User
Beiträge: 6
Registriert: Dienstag 21. Juli 2020, 18:48

__blackjack__ hat geschrieben: Dienstag 21. Juli 2020, 22:52 @Michael202007: Also ich bin dann hier raus wenn Du nicht ein bisschen eigene Leistung zeigen magst. Du weisst ja anscheinend schon wie das bei einem `QPushbutton` geht. Bei einem `QTabWidget` geht das grundsätzlich genau so. Ein Beispiel hast Du also bereits. Und allgemein wird es in den beiden genannten Dokumentationen beschrieben.

Beim Transfer des Wissens von dem Signal beim Button kann es zu Problemen kommen, aber dann zeig die mal bitte konkret. Also was Du gemacht hast, und was dabei dann ganz konkret nicht funktioniert. Also den Code und die Fehlermeldung die Du da bekommst.
Super !
Antworten