PyQt4:在一组小部件上添加QSrollArea

2024-05-15 01:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个带有stackedwidgets和QGridLayout的界面,其中有些小部件是动态添加的。。。我想为每一组小部件添加一个qsrolledrea(请参阅随附的屏幕截图,其中一组小部件可以动态添加),但我不知道如何添加,你能帮我吗?你知道吗

...

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

附上截图


Tags: imageselflecomrefdedicodu
1条回答
网友
1楼 · 发布于 2024-05-15 01:35:12

你要做的是把QGridLayout放在一个QWidget中,这个放在QScrollArea中,然后这个滚动区域放在另一个布局中,最后把这个布局放在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下载完整的代码。你知道吗

enter image description here

相关问题 更多 >

    热门问题