IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

[PyQT6] QTabWidget event tab active / refresh data


Sujet :

PyQt Python

  1. #1
    Candidat au Club Avatar de jeanne_mbp
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2022
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [PyQT6] QTabWidget event tab active / refresh data
    Bonjour à tous,

    Voilà, je suis actuellement sur un petit projet et je me suis lance sur PyQT (nouveau pour moi) malheureusement je suis face à un problème avec "QTabWidget" en effet j'essaye tant bien que mal d'avoir un événement qui déclenche une fonction.

    J'ai construit un petit exemple afin d'illustrer mon souci dont voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    import sys
     
    from PyQt6.QtWidgets import *
     
     
    class Home(QWidget):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
            print("Home Widget Load")
     
            self.home_layout = QFormLayout(self)
     
            self.home_layout.addRow("Username", QLineEdit(self))
            self.home_layout.addRow("Password:", QLineEdit(self))
     
            self.setLayout(self.home_layout)
     
     
    class List(QWidget):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
            print("List Widget Load")
     
            self.list_layout = QVBoxLayout()
     
            self.list_table = QTableWidget()
            self.list_table.setColumnCount(3)
            self.list_table.setRowCount(0)
            self.list_table.setSortingEnabled(True)
            self.list_table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
            self.list_table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
     
            self.list_header = self.list_table.horizontalHeader()
            self.list_header.setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
     
            self.list_table.setHorizontalHeaderItem(0, QTableWidgetItem("Id"))
            self.list_table.setHorizontalHeaderItem(1, QTableWidgetItem("Username"))
            self.list_table.setHorizontalHeaderItem(2, QTableWidgetItem("Password"))
     
            ## Load Random Data
            self.loadRandomData()
     
            self.list_layout.addWidget(self.list_table)
     
            self.setLayout(self.list_layout)
     
        def loadRandomData(self):
            for i in range(0, 500000):
                self.list_table.insertRow(self.list_table.rowCount())
     
                self.list_table.setItem(i, 0, QTableWidgetItem(f"{i}"))
                self.list_table.setItem(i, 1, QTableWidgetItem(f"Username{i}"))
                self.list_table.setItem(i, 2, QTableWidgetItem(f"qwerty{i}"))
     
     
    class MainWindows(QWidget):
        def __init__(self):
            super().__init__()
     
            self.setWindowTitle("Test Tab Load")
     
            self.main_layout = QGridLayout(self)
            self.setLayout(self.main_layout)
     
            self.main_tab = QTabWidget(self)
            self.main_tab.setUsesScrollButtons(True)
     
            self.main_tab.addTab(Home(), "Home")
            self.main_tab.addTab(List(), "List")
     
            self.main_layout.addWidget(self.main_tab)
     
            self.show()
     
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
     
        window = MainWindows()
     
        sys.exit(app.exec())
    Au chargement de l'application je tombe sur mon premier onglet, donc je n'ai aucun souci sur cela, cependant sur l'onglet "Liste" j'aimerais que le contenu ne soit charge qu'à partir du moment ou l'utilisateur clique dessus et non au chargement de l'application. (comme c'est le cas actuellement)

    Dans le même principe, j'aimerais que si l'utilisateur switch de l'onglet "home" vers l'onglet "liste" le contenu se refresh. (dans l'exemple ci-dessus le nombre de données ne serait donc pas les mêmes)

    J'écris ce message car je n'ai pas trouvé de solution, la plupart des solutions qui ne m'aident pas pour autant concernent des événements ou l'onglet est cree via l'action d'un bouton. Hors dans notre cas il est déjà cree et n'a aucune manipulation.

    J'ai vu pas mal d'information concernant un bout de code du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.main_tab.currentChanged.connect(self.tabChange)
    Mais j'avoue ne pas comprendre puisque les enfants ne sont pas impactés lors de l'écoute de cet event.

    Merci à vous pour votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Oui c'est bien le signal currentChanged que tu dois utiliser pour cela.

    Tu fais cela dans la mainWindow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            self.main_layout.addWidget(self.main_tab)
            self.main_tab.currentChanged.connect(self.on_tab_changed)
            self.show()
     
        def on_tab_changed(self, idx):
            if idx:
                # c'est la liste, tu n'as pas gardé de référence alors
                # on va la chercher d'abord
                self.main_tab.currentWidget().loadRandomData()
    Un conseil, pour ta mainWindow fais plutôt un héritage de QMainWindow, tu bénéficieras entre autres d'une barre de menu et d'une barre de status

  3. #3
    Candidat au Club Avatar de jeanne_mbp
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2022
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Effectivement cela fonctionne dans mon projet principal,

    Merci pour votre réponse et de votre conseil.

    Citation Envoyé par VinsS Voir le message
    Salut,

    Oui c'est bien le signal currentChanged que tu dois utiliser pour cela.

    Tu fais cela dans la mainWindow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            self.main_layout.addWidget(self.main_tab)
            self.main_tab.currentChanged.connect(self.on_tab_changed)
            self.show()
     
        def on_tab_changed(self, idx):
            if idx:
                # c'est la liste, tu n'as pas gardé de référence alors
                # on va la chercher d'abord
                self.main_tab.currentWidget().loadRandomData()
    Un conseil, pour ta mainWindow fais plutôt un héritage de QMainWindow, tu bénéficieras entre autres d'une barre de menu et d'une barre de status

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/05/2016, 03h47
  2. [Débutant] Event RowEnter activé 2 fois sur un DataGridView
    Par noftal dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/09/2013, 10h01
  3. rech. doc sur table gateway, active record, data mapper
    Par elderion dans le forum Design Patterns
    Réponses: 0
    Dernier message: 24/08/2011, 10h22
  4. event tab non détecté sur iE
    Par ekremyilmaz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/01/2011, 13h06
  5. Activer LOAD DATA LOCAL INFILE
    Par m-mas dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/01/2008, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo