QTabWidget Reiter automatisch anwählen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

huhu ich hab mal wieder ein kleines problem.

und zwar habe ich mir mit QTabWidget ein Fenster mit 2 Reitern gebastelt. noch heißen diese tab und tab_2 und ich will diese per Code einzeln "ansteuern" bzw anzeigen lassen(werden noch umbenannt)
Beispielcode per Button auf dem Fenster:

Code: Alles auswählen

def __init__(self):
        #läd die .ui datei
        self.ui = loadUi('TestReiter.ui')
        self.ui.Button.clicked.connect(self.Reiter)
        self.ui.show()
    def Reiter(self):
        self.ui.tab_2.show()
mit tab_2.show wird mir zwar das zeug aus dem 2. tab angezegit , aber der Reiter steht immer noch auf 1. wechsel ich zwischen diesen reiter ist alles wieder auf der ausgangsstellung.
könnte mir wer weiterhelfen. das ganze wollte ich dann mitm raspberry pi ansteuern indem ich hier einen Schalter umlege und in dem erstellten Fenster soll dann der speziele reiter/tab durch das umlegen angezeigt werden.

ergänzung:
gerade ist mir aufgefallen, das wen ich den knopf drücke und das Textfeld aus reiter 2 angezeigt wird ich es wirklich nur sehe, aber nicht bearbeiten kann.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Ligurio: Suchst Du currentIndex?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ließ dir doch mal die Beschreibung der klasse im der Dokumentation durch. Da drin werden die Methoden zum Anzeigen eines bestimmten Tabs explizit genannt ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Ich habe die Dokumentation für eine solche funktion schon durchgeschaut, aber nichts hat geklappt. eventuell habe ich die befehle auch falsch verwendet, deshalb habe ich hier ja die frage gestellt.

Wäre schön wenn ihr mir noch n klein tipp geben könntet.
mit currentIndex() hatte ich noch keinen erfolg bzw bestimmt falsch verwendet
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

currentIndex() ist quasi nur der getter. Verwende setCurrentIndex(int index) und du hast, was du erreichen willst. Der Parameter index ist dabei jener Index, der angibt welcher Tab aktiv ist. (Startet bei 0 :wink: )
BlackJack

Wobei `setCurrentWidget()` unter Umständen den lesbareren Code ergeben dürfte wenn man den Widgets sinnvolle Namen vergeben hat. Ein ``self.ui.config_tabs.setCurrentWidget(self.ui.print_config_tab)`` sagt dem Leser mehr als ``self.ui.config_tabs.setCurrentIndex(3)`` wo man erst einmal rätseln darf was die 3 bedeutet.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Ligurio: Ich habe von unterwegs auf dem Handy geschrieben, daher konnte ich den Absatz nicht zitieren, bzw es ist mir dann zu lästig. Aber wenn ich es richtig gezählt habe, steht das im sechsten Absatz - imho nicht sehr viel zu lesen. Zudem hättest du die Doku ja auch verlinken und darauf hinweisen können, daß du da damit nicht verstehst... wobei ich auch nicht angenommen habe, dass so ein simpler Aufruf Probleme bereiten könnte...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Hallo Danke für eure hilfen.
muss ich noch etwas aus einer bibliothek importieren ?

diese meldung bekomm ich:
AttributeError: 'QMainWindow' object has no attribute 'config_tabs'

oder

AttributeError: 'QMainWindow' object has no attribute 'setCurrentIndex'
BlackJack

@Ligurio: ``import brain`` und das dann bitte einschalten und benutzen. Weiss ich wie Dein `QTabWidget`-Exemplar und/oder Deine `QTab`-Exemplare sinnvollerweise heissen?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben:Wobei `setCurrentWidget()` unter Umständen den lesbareren Code ergeben dürfte wenn man den Widgets sinnvolle Namen vergeben hat [...]
Genau da ist der Haken, zumindest beim kollaborativen Arbeiten. Der Index ist unmissverständlich und im schlimmsten Fall endet es mit OOR. Auf Namen verlasse ich mich nur ungern, zu oft wurde beim Refactoren unsauber gearbeitet. Das ist aber nur meine persönliche Erfahrung und auch nur meine Meinung. ;-)

@Ligurio
AttributeError: 'QMainWindow' object has no attribute 'config_tabs'
Das sagt doch alles, oder? Erstens scheinst du zu versuchen setCurrentIndex auf dem MainWindow aufzurufen und zweitens scheint config_tabs nicht bekannt zu sein, zumindest nicht dem Fenster. Was ist denn config_tabs überhaupt, der ObjectName oder ein int?
BlackJack

@Madmartigan: Die Argumentation kann ich nicht nachvollziehen. Klar kann beim Refaktorisieren eine Änderung eines Namens an der ein oder anderen Stelle vergessen werden. Das ist aber leicht zu beheben wenn man die Quelltextbasis nach dem alten Namen absucht. Auf der anderen Seite ist beim umsortieren, entfernen, oder einfügen eines Tabs bei magischen Indexwerten echt Schluss mit lustig weil man da nicht einfach nach den Zahlen suchen kann wie man nach einem Namen suchen könnte. Es gibt sicher mehr 0en, 1en, oder 2en im Programm die etwas anderes als Tabindizes bedeuten als es Namen wie `print_config_tab` gibt, die für etwas anderes stehen als ein Tab mit den Optionen für den Druck.

Zur Nachfrage an Ligurio: Was wird ``self.ui.config_tabs`` wohl sein? Sicherlich kein `int`, ich wüsste jedenfalls nicht wie man das mit dem Designer hinbekommt. Das war ja Beispielquelltext von mir den Ligurio ohne nachzudenken einfach ausgeführt hat.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Es existiert auch keinerlei Anforderung, dass du das nachvollziehen kannst. Jeder macht eben seine Erfahrungen und ich bin selten gut damit gefahren, mich auf Namen zu verlassen. Indices sind mir da wesentlich näher, auch erinnere ich mich nicht, jemals Tabs umsortiert oder zur Laufzeit hinzugefügt/entfernt zu haben.

Wie kann ich wissen ob config_tabs in seinem Code ein int ist oder sonst etwas anderes? Aus dem Post der Fehlermeldung geht das nicht hervor. Sicherlich, ich hätte annehmen können, er beruft sich da auf dein Beispiel. Aber der Anfang aller Verwirrungen ist eine Annahme. Auch wieder persönliche Erfahrung...

*Ende meines Off-Topic*
BlackJack

@Madmartigan: Das Du keine Tabs umsortierst kann ich dagegen sehr gut nachvollziehen, den Aufwand würde ich mir bei magischen Indizes auch zwei bis dreimal überlegen. ;-)
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Code: Alles auswählen

from PyQt4.QtGui import QApplication
from PyQt4.QtGui import QTabWidget
from PyQt4.uic import loadUi
from PyQt4 import QtCore
from PyQt4 import QtGui
import sys
class Window(object):
    def __init__(self):
        self.ui = loadUi('TestReiter.ui')
        self.ui.Klickbutton.clicked.connect(self.Reiter)
        self.ui.lineEdit.setText("hier steht der Text")
        self.ui.show()
    def Reiter(self):
        self.ui.tabWidget.setCurrentIndex(1)
        
def main():
    app = QApplication(sys.argv)   
    window = Window()
    app.exec_()  
     
if __name__ == '__main__':
    main()
Ui Fenster erklärung
ein Button heißt: Klickbutton
der objektname für die Reiter heißt: tabWidget
Reiter 1 und 2 heißen noch mit default: tab und tab_2

Die bezeichnungen habe ich mal jetzt so gelassen wie sie im Qt Designer standardmäßig heißen.

so klappt es!!!
Danke euch. war einfach auf dem Schlauch gestanden
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das Ansprechen über einen Index ist komplexer, man hat eine Indirektion mehr als beim Ansprechen über die Widget-Referenz. Und fehlerhaftes Refactoring ist mit beidem "machbar".
Antworten