2017-06-28 2 views
0

J'ai un QtableWidget rempli de formulaires (formulaire importé). Chaque formulaire est fondamentalement un Qgroupbox qui contient quelques boutons-poussoirs et un spinbox. J'ai choisi de les mettre dans la table afin que les touches fléchées puissent être utilisées pour naviguer entre les boîtes de groupe. Mais je veux que chaque bouton soit vérifiable via un raccourci clavier ET que le spinbox soit ajusté via une sorte de raccourci clavier (peut-être shift plus flèche). J'ai la navigation qui fonctionne principalement mais les raccourcis que j'ai assignés aux boutons poussoirs ne fonctionnent pas. Il semble que j'ai besoin d'un moyen de "passer" le raccourci de la boîte de groupe qui a le focus sur le widget cible à l'intérieur de cette boîte de groupe. Le deuxième problème d'ajustement des boîtes de sélection semble être lié, mais je suis encore moins clair sur la façon de mettre en place cela.pyqt5 Comment se connecter raccourci au widget enfant

J'ai attaché la plupart du code (généré avec QTCtreator) pour le formulaire. Il est intéressant pour moi que le code de raccourci soit dans la méthode retranslate.

image de formulaire unique

image de la grille des formes

class Ui_FormLoads(object): 
    def setupUi(self, FormLoads): 
     FormLoads.setObjectName("FormLoads") 
     FormLoads.resize(88, 105) 
     FormLoads.setFocusPolicy(QtCore.Qt.TabFocus) 
     FormLoads.setWindowTitle("LoadChannel") 
     self.gridLayout = QtWidgets.QGridLayout(FormLoads) 
     self.gridLayout.setContentsMargins(8, 8, 8, 8) 
     self.gridLayout.setSpacing(0) 
     self.gridLayout.setObjectName("gridLayout") 
     self.groupBox = QtWidgets.QGroupBox(FormLoads) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.groupBox.setFont(font) 
     self.groupBox.setObjectName("groupBox") 
     self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox) 
     self.gridLayout_2.setContentsMargins(8, 8, 8, 8) 
     self.gridLayout_2.setObjectName("gridLayout_2") 
     self.pushStop = QtWidgets.QPushButton(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.pushStop.sizePolicy().hasHeightForWidth()) 
     self.pushStop.setSizePolicy(sizePolicy) 
     self.pushStop.setMinimumSize(QtCore.QSize(30, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.pushStop.setFont(font) 
     self.pushStop.setText("Stop") 
     self.pushStop.setCheckable(True) 
     self.pushStop.setObjectName("pushStop") 
     self.gridLayout_2.addWidget(self.pushStop, 1, 0, 1, 1) 
     self.pushReload = QtWidgets.QPushButton(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.pushReload.sizePolicy().hasHeightForWidth()) 
     self.pushReload.setSizePolicy(sizePolicy) 
     self.pushReload.setMinimumSize(QtCore.QSize(30, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(10) 
     self.pushReload.setFont(font) 
     self.pushReload.setText("Load") 
     self.pushReload.setCheckable(True) 
     self.pushReload.setObjectName("pushReload") 
     self.gridLayout_2.addWidget(self.pushReload, 1, 1, 1, 1) 
     self.spinBox = QtWidgets.QSpinBox(self.groupBox) 
     sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.spinBox.sizePolicy().hasHeightForWidth()) 
     self.spinBox.setSizePolicy(sizePolicy) 
     self.spinBox.setMinimumSize(QtCore.QSize(51, 0)) 
     font = QtGui.QFont() 
     font.setPointSize(13) 
     self.spinBox.setFont(font) 
     self.spinBox.setMinimum(-20) 
     self.spinBox.setMaximum(12) 
     self.spinBox.setObjectName("spinBox") 
     self.gridLayout_2.addWidget(self.spinBox, 0, 0, 1, 2) 
     self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) 

     self.retranslateUi(FormLoads) 
     QtCore.QMetaObject.connectSlotsByName(FormLoads) 

    def retranslateUi(self, FormLoads): 
     _translate = QtCore.QCoreApplication.translate 
     self.groupBox.setTitle(_translate("FormLoads", "GroupBox")) 
     self.pushStop.setShortcut(_translate("FormLoads", "S")) 
     self.pushReload.setShortcut(_translate("FormLoads", "L")) 
+0

Pourquoi voulez-vous cela dans la méthode traduire? – eyllanesc

+0

Je ne le veux pas forcément dans la méthode de traduction mais c'est là que QtCreator le met automatiquement. Je suis curieux de savoir si c'est un bug ou quelque chose? – chmedly

+0

Ok, qu'en est-il du spinbox, que voulez-vous dire? – eyllanesc

Répondre

1

Eh bien, je me suis dit comment faire. [btw formLoad est le nom de variable que j'utilise pour les formulaires lorsque je parcoure pour remplir la table. actionStop est le nom de la variable que je utilise pour ce raccourci particulier.]

self.formLoad.actionStop = QtWidgets.QShortcut(QtGui.QKeySequence("S"), self.formLoad) 
self.formLoad.actionStop.activated.connect(self.formLoad.ui.pushStop.click) 
self.formLoad.actionStop.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 

A) La première était de comprendre la portée et mise au point. J'ai fini par mettre le widget le plus ancien (pour la forme) sur strongfocus et tout le reste sauf la spinbox sur nofocus. Le spinbox est réglé sur wheelfocus ce qui lui permet d'être roulé ou typé. Les paramètres de mise au point peuvent être définis dans QtCreator/Designer, ce qui signifie qu'il y a moins de choses à ajouter dans votre fichier py principal. En maintenant la mise au point sur les boutons, la commande de la touche passe du focus à un bouton individuel qui, selon moi, peut poser problème sur un Mac, selon que les raccourcis clavier sont réglés sur «all» dans les préférences du système. Ensuite, la définition de l'attribut de contexte à 'WidgetWithChildrenShortcut' permet à la commande keycommand de filtrer vers le bas depuis le widget supérieur vers le bouton-poussoir. [btw, Il ne semble pas y avoir de moyen de définir le contexte en utilisant les raccourcis que vous pouvez définir dans QtCreator donc j'ai défini explicitement les raccourcis.] Lorsque j'ai créé le raccourci actionStop, vous pouvez voir que je l'ai assigné à formLoad parent. Cela affecte le raccourci au widget défini pour strongfocus.

self.formLoad.actionIncrement = QtWidgets.QShortcut(QtGui.QKeySequence("Alt+Up"), self.formLoad) 
self.formLoad.actionIncrement.activated.connect(self.formLoad.ui.spinBox.stepUp) 
self.formLoad.actionIncrement.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 
self.formLoad.actionDecrement = QtWidgets.QShortcut(QtGui.QKeySequence("Alt+Down"), self.formLoad) 
self.formLoad.actionDecrement.activated.connect(self.formLoad.ui.spinBox.stepDown) 
self.formLoad.actionDecrement.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 

B) En second lieu, je devais trouver les attributs (et leurs noms) qui peuvent être « déclenchée » par un raccourci. Ceux-ci ne sont pas clairement documentés sur la page principale de QT pour QPushButton ou QSpinBox. J'ai trouvé l'attribut "click" dans un exemple de code en ligne et j'ai trouvé les attributs du bouton haut et bas dans la documentation QT pour QAbstractSpinBox. 'stepUp' et 'stepDown' équivalent à cliquer sur les boutons haut et bas du spinbox. Dans ce cas, j'ai utilisé la touche de modification Alt avec les flèches haut et bas. Quelque part dans la documentation Qt se trouve la liste des raccourcis clavier avec leurs titres de chaînes ("Alt + Up" etc). C) Enfin, j'ai décidé d'implémenter des commandes clés qui chargent directement une valeur spécifique dans le spinbox. Cela a été plus compliqué car vous ne pouvez pas utiliser la fonction 'setValue' directement à partir de la ligne activated.connect. J'ai essayé quelques variations sur lambda mais l'importation de functools et l'utilisation partielle avec une fonction séparée est ce qui a fonctionné. Le dernier élément qui est passé par partial est le spinbox qui était un sous-widget de la cellule en cours de remplissage.De cette façon, la méthode sait à quelle spinbox appliquer la valeur. Sans l'envoyer, il appliquera toujours la valeur au dernier 'formLoad.spinBox' qui a été défini avec ce nom. Le deuxième élément transmis (appelé clé) est la valeur. Cela permet à la méthode one (spinboxset) d'être utilisée pour plusieurs commandes de touches. Par exemple, un autre peut être réglé sur "5".

self.formLoad.actionFive = QtWidgets.QShortcut(QtGui.QKeySequence("5"), self.formLoad) 
self.formLoad.actionFive.setContext(QtCore.Qt.WidgetWithChildrenShortcut) 
self.formLoad.actionFive.activated.connect(functools.partial(self.spinboxset, 5, self.formLoad.ui.spinBox)) 

Maintenant, si quelqu'un peut me montrer comment copier et coller tous les paramètres d'une cellule entre les cellules que je vais mettre en ...