[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:
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:
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.