PyQt4:在一组窗口小部件上添加一个QSrollArea
我正在编写一个与stackedwidgets和QGridLayout的接口,其中有一些窗口小部件对于某些动态添加...我想为每组添加一个QSrolledArea窗口小部件(请参阅附加的屏幕截图,其中显示了可以随时添加的窗口小部件组),但我不知道如何,能帮助我吗?PyQt4:在一组窗口小部件上添加一个QSrollArea
... def ajouter_ref_artistique(self) :
'''
'''
#
r = len(self.liste_ref_artistiques)
#if r >= 0 : self.label_annonce_vocab.hide()
# Création des QTextEdit
self.dico_chem_ref_art[r] = QTextEdit()
self.dico_com_ref_art[r] = QTextEdit()
self.dico_chem_ref_art[r].setMaximumWidth(170)
self.dico_chem_ref_art[r].setMinimumWidth(170)
self.dico_chem_ref_art[r].setMaximumHeight(84)
self.dico_chem_ref_art[r].setMinimumHeight(84)
self.dico_com_ref_art[r].setMaximumWidth(398)
self.dico_com_ref_art[r].setMinimumWidth(398)
self.dico_com_ref_art[r].setMaximumHeight(84)
self.dico_com_ref_art[r].setMinimumHeight(84)
# Création des boutons de chargement
self.dico_bout_charg_ref_art[r] = QPushButton(u"Ouvrir ref {}".format(r+1))
'''
# Conditions de redimensionnement
if r > 5 :
self.dico_vocab_mot[r].setMaximumHeight(34)
self.dico_vocab_mot[r].setMinimumHeight(34)
self.dico_vocab_def[r].setMaximumHeight(34)
self.dico_vocab_def[r].setMinimumHeight(34)
'''
# Répartition dans la grille
self.grille_3_stack_5.addWidget(self.dico_chem_ref_art[r], r, 0)
self.grille_3_stack_5.addWidget(self.dico_com_ref_art[r], r, 1)
self.grille_3_stack_5.addWidget(self.dico_bout_charg_ref_art[r], r, 2)
# Ecriture des n°s de lignes dans la partie mots de vocabulaire
self.dico_chem_ref_art[r].setText(str(r+1)+'. ')
# Les données sont introduites dans une liste
self.liste_ref_artistiques.append([self.dico_chem_ref_art[r], self.dico_com_ref_art[r], self.dico_bout_charg_ref_art[r]])
# =====================================================
# Signaux
# ---------- Récup des données textuelles
self.dico_chem_ref_art[r].textChanged.connect(self.changements_phase_5)
self.dico_com_ref_art[r].textChanged.connect(self.changements_phase_5)
# ---------- Récup du libellé du bouton sélectionné par l'utilisateur
self.dico_bout_charg_ref_art[r].released.connect(self.libelle_bouton_ref_art)
# =====================================================
def supprimer_ref_artistique(self) :
'''
'''
row = len(self.liste_ref_artistiques) - 1
if row >= 0:
for column in range(self.grille_3_stack_5.columnCount()):
item = self.grille_3_stack_5.itemAtPosition(row, column)
if item is not None:
item.widget().deleteLater()
del self.liste_ref_artistiques[row]
del self.dico_chem_ref_art[row]
del self.dico_com_ref_art[row]
del self.dico_bout_charg_ref_art[row]
def changements_phase_5(self) :
"""
"""
self.liste_ref_artistiques_finale = [[unicode(refart[0].toPlainText()), unicode(refart[1].toPlainText()), unicode(refart[2])] for refart in self.liste_ref_artistiques]
print
print "self.liste_ref_artistiques_finale :"
print
print self.liste_ref_artistiques_finale
print
def libelle_bouton_ref_art(self) :
'''
Sélectionner l'id du bouton pressé en vue de
l'affichage du chemin de l'image sélectionnée
dans le QTextEdit dédié
'''
#
message_bouton_ref_art = self.sender()
# Le texte du bouton (par ex pour le bouton n°2) est
# de la forme : Ouvrir ref 2
texte_bouton = message_bouton_ref_art.text()
# On ne sélectionne que le texte comprenant le numéro
# du bouton
numero_bouton = texte_bouton.right(2) # Lecture à partir de la droite
# Si il y a un espace ds la sélection, c'est à dire,
# par exemple, pour le 3ème bouton on obtiendra " 3",
# ... si il y 10 boutons, on aura "10" (on se laisse
# la possibilité de pouvoir sélectionner de 1 à 99
# boutons)
if numero_bouton[0:1] == " ": numero_bouton = numero_bouton[1:2]
# Le numéro du bouton prend le type integer
numero_bouton = int(numero_bouton)
# Attribution de l'indice du bouton
i = numero_bouton - 1
# =====================================================
# Signal
# ---------- Affichage des images/vignettes et chemins images
self.dico_bout_charg_ref_art[i].clicked.connect(lambda: self.ouvrir_image_boite_ref_art(i))
# =====================================================
def ouvrir_image_boite_ref_art(self, n) :
''' Fonction pour la boîte de dialogue d'ouverture
pour charger les différentes oeuvres (références artistiques) '''
# La boîte
ouv_fichier = QFileDialog.getOpenFileName(self, 'Ouvrir une image', os.path.expanduser('~'), 'Images (*.jpg *.jpeg *.JPG *.JPEG *.png *.gif)')
# Récup du chemin et nom de fichier
chemin_fichier_ref_art = unicode(ouv_fichier)
# === Redimensionnnement de l'image pour affichage dans le QTextEdit ======
# Largeur de la future vignette
nouv_w_1 = 120
# Ouverture de l'image
obImg_1 = Image.open(chemin_fichier_ref_art)
# Recup dimensions de l'image 1)
w_1, h_1 = obImg_1.size
# Calcul du ratio de l'image 1)
ratio_1 = float(w_1)/float(h_1)
# Calcul de future hauteur avec les dimensions donnees par l'utilisateur
calcHauteur_img_1 = int(float(nouv_w_1)/ratio_1)
# =========================================================================
# Affichage de l'image dans le QTextEdit
self.dico_chem_ref_art[n].setHtml('<center><img src="{}" width="{}" height="{}" title="{}" /></center><h6><b>{}</b></h6>'.format(chemin_fichier_ref_art, nouv_w_1, calcHauteur_img_1, chemin_fichier_ref_art, chemin_fichier_ref_art))
# La liste finale des données est réactualisée avec les
# nouvelles données (le chemin et nom de l'image chargée)
del self.liste_ref_artistiques_finale[n][0]
self.liste_ref_artistiques_finale[n].insert(0, chemin_fichier_ref_art)
整个代码是在这里:
https://pastebin.com/igVv6dcw
连接
回答:
,你所要做的就是将一个QWidget里面QGridLayout的截图,而这一次在QScrollArea里面,然后在另一个布局里面这个Scrollarea,最后把这个布局放在QGroupBox里面:
def stack_phase_5(self) : [...]
self.grille_2_stack_5.setSpacing(174)
"""
Changes
"""
scrollArea = QScrollArea(self)
scrollArea.setWidgetResizable(True)
wid = QWidget(self)
scrollArea.setWidget(wid)
self.grille_3_stack_5 = QGridLayout(wid)
self.grille_3_stack_5.setSpacing(0)
[...]
groupe_2.setLayout(self.grille_2_stack_5)
# changes
groupe_3.setLayout(QVBoxLayout())
groupe_3.layout().addWidget(scrollArea)
layout = QGridLayout()
[...]
注:我建议你分开代码成几个小部件,这些都是几个文件,所以你可以调试你的代码更好。
您可以下载link的完整代码。
以上是 PyQt4:在一组窗口小部件上添加一个QSrollArea 的全部内容, 来源链接: utcz.com/qa/257154.html