python - 允许在 QComboBox 中水平滚动

标签 python pyqt4 scrollbar qcombobox

是否可以添加水平滚动条(以便能够将项目滚动到行尾),同时保持组合框的尺寸如我的消息中所附的屏幕截图所示?如果是这样,怎么办?

相关方代码:

def ajouter_eval(self) :
    '''
    '''
    # Liste des compétences travaillées en classe de 6ème
    liste_c_t_6e = [u"Faites le choix de votre item ici.", u"(E1) Choisir, organiser et mobiliser des gestes, des outils et des matériaux en fonction des effets qu'ils produisent.", \
    u"(E2) Représenter le monde environnant ou donner forme à son imaginaire en explorant divers domaines (dessin, collage, modelage, sculpture, photographie, vidéo...).", \
    u"(E3) Rechercher une expression personnelle en s'éloignant des stéréotypes.", u"(E4) Intégrer l'usage des outils informatiques de travail de l'image et de recherche d'information, au service de la pratique  plastique.", \
    u"(P1) Identifier les principaux outils et compétences nécessaires à la réalisation d'un projet artistique.", u"(P2) Se repérer dans les étapes de la réalisation d'une production plastique individuelle ou collective, anticiper les difficultés éventuelles.", \
    u"(P3) Identifier et assumer sa part de responsabilité dans un processus coopératif de création.", u"(P4) Adapter son projet en fonction des contraintes de réalisation et de la prise en compte du spectateur.", \
    u"(A1) Décrire et interroger à l'aide d'un vocabulaire spécifique ses productions plastiques, celles de ses pairs et des oeuvres d'art étudiées en classe.", \
    u"(A2) Justifier des choix pour rendre compte du cheminement qui conduit de l'intention à la réalisation.", \
    u"(A3) Formuler une expression juste de ses émotions, en prenant appui sur ses propres réalisations plastiques, celles des autres élèves et des oeuvres d'art.", \
    u"(R1) Repérer, pour les dépasser, certains a priori et stéréotypes culturels et artistiques.", \
    u"(R2) Identifier quelques caractéristiques qui inscrivent une oeuvre d'art dans une aire géographique ou culturelle et dans un temps historique, contemporain, proche ou lointain.", \
    u"(R3) Décrire des oeuvres d'art, en proposer une compréhension personnelle argumentée."]
    # Liste des compétences travaillées pour les classes de 5ème, 4ème et 3ème
    liste_c_t_5e4e3e = [u"Faites le choix de votre item ici.", u"(E1) Choisir, mobiliser et adapter des langages et des moyens plastiques variés en fonction de leurs effets dans une intention artistique en restant attentif à l'inattendu.", \
    u"(E2) S'approprier des questions artistiques en prenant appui sur une pratique artistique et réflexive.", u"(E3) Recourir à des outils numériques de captation et de réalisation à des fins de création artistique.", \
    u"(E4) Explorer l'ensemble des champs de la pratique plastique et leurs hybridations, notamment avec les pratiques numériques.", \
    u"(E5) Prendre en compte les conditions de la réception de sa production dès la démarche de création, en prêtant attention aux modalités de sa présentation, y compris numérique.", u"(E6) Exploiter des informations et de la documentation, notamment iconique, pour servir un projet de création.", \
    u"(P1) Concevoir, réaliser, donner à voir des projets artistiques, individuels ou collectifs.", u"(P2) Mener à terme une production individuelle dans le cadre d'un projet accompagné par le professeur.", \
    u"(P3) Se repérer dans les étapes de la réalisation d'une production plastique et en anticiper des difficultés éventuelles.", u"(P4) Faire preuve d'autonomie, d'initiative, de responsabilité, d'engagement et d'esprit critique dans la conduite d'un projet artistique.", \
    u"(P5) Confronter intention et réalisation dans la conduite d'un projet pour l'adapter et le réorienter, s'assurer de la dimension artistique de celui-ci.", \
    u"(A1) Dire avec un vocabulaire approprié ce que l'on fait, ressent, imagine, observe, analyse; s'exprimer pour soutenir des intentions artistiques ou une interprétation d'oeuvre.", u"(A2) Établir des liens entre son propre travail, les oeuvres rencontrées ou les démarches observées.", \
    u"(A3) Expliciter la pratique individuelle ou collective, écouter et accepter les avis divers et contradictoires.", u"(A4) Porter un regard curieux et avisé sur son environnement artistique et culturel, proche et lointain, notamment sur la diversité des images fixes et animées, analogiques et numériques.", \
    u"(R1) Reconnaître et connaître des oeuvres de domaines et d'époques variés appartenant au patrimoine national et mondial, en saisir le sens et l'intérêt.", \
    u"(R2) Identifier des caractéristiques (plastiques, culturelles, sémantiques, symboliques) inscrivant une oeuvre d'art dans une aire géographique ou culturelle et dans un temps historique.", u"(R3) Proposer et soutenir l'analyse et l'interprétation d'une oeuvre.", \
    u"(R4) Interroger et situer oeuvres et démarches artistiques du point de vue de l'auteur et de celui du spectateur.", u"(R5) Prendre part au débat suscité par le fait artistique."]
    # Liste des items du domaine du socle
    liste_items_socle = [u"Faites le choix de votre item ici.", u"(D1-1-1-1) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Parler/communiquer/écouter", u"(D1-1-1-2) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Lire", \
    u"(D1-1-1-3) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Ecrire", u"(D1-1-1-4) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Utiliser les règles de la langue", \
    u"(D1-1-1-5) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Apprendre les origines de la langue française", u"(D1-2-2-1) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Pratiquer deux langues", \
    u"(D1-2-2-2) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Comprendre, s'exprimer en langue étrangère", u"(D1-2-2-3) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Dialoguer en langue étrangère" \
    u"(D1-2-2-4) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Adapter le niveau de langue étrangère à la situation", u"(D1-2-2-5) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Communiquer dans le quotidien en langue étrangère", \
    u"(D1-3-3-1) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Utiliser système décimal et langages formels", u"(D1-3-3-2) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Lire les plans, se repérer sur des cartes", \
    u"(D1-3-3-3) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Produire et utiliser des représentations", u"(D1-3-3-4) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Savoir les utilisations des langages informatiques", \
    u"(D1-3-3-5) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Connaître les principes d'algorithmique et de programmation", u"(D1-3-3-6) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Créer des applications simples", \
    u"(D1-4-4-1) Comprendre, s'exprimer en utilisant les langages des arts et du corps > S'exprimer et communiquer par les arts", u"(D1-4-4-2) Comprendre, s'exprimer en utilisant les langages des arts et du corps > Connaître, comprendre les langages artistiques utilisés", \
    u"(D1-4-4-3) Comprendre, s'exprimer en utilisant les langages des arts et du corps > S'exprimer par des activités, physiques, sportives ou artistiques", u"(D2-1-1) Organisation du travail personnel > Anticiper/gérer/mémoriser/planifier", \
    u"(D2-1-2) Organisation du travail personnel > Comprendre des consignes", u"(D2-1-3) Organisation du travail personnel > Mettre en oeuvre les capacités essentielles", u"(D2-1-4) Organisation du travail personnel > Identifier et résoudre un problème", \
    u"(D2-1-5) Organisation du travail personnel > Se constituer des outils personnels", u"(D2-2-1) Coopération et réalisation de projets > Travailler en équipe", u"(D2-2-2) Coopération et réalisation de projets > Gérer un projet", u"(D2-2-3) Coopération et réalisation de projets > Savoir que l'école est un lieu des savoirs", \
    u"(D2-2-4) Coopération et réalisation de projets > Utiliser des outils numériques", u"(D2-3-1) Médias, démarches de recherche et de traitement de l'information > Histoire de l'écrit, modes de production de l'image", u"(D2-3-2) Médias, démarches de recherche et de traitement de l'information > Utiliser des outils de recherche", \
    u"(D2-3-3) Médias, démarches de recherche et de traitement de l'information > Traiter les informations collectées, organiser, mémoriser", ]

    #
    r = len(self.liste_compet_travail_socle_eval)
    #if r >= 0 : self.label_annonce_vocab.hide()
    # Création du combo pour sélection des compétences travaillées
    self.dico_combo_compet_travail[r] = QComboBox()
    self.dico_combo_compet_travail[r].setMaximumWidth(250)
    self.dico_combo_compet_travail[r].setMinimumWidth(250)
    # Création du QTextEdit
    self.dico_traduc_compet_travail[r] = QTextEdit()
    self.dico_traduc_compet_travail[r].setMaximumWidth(280)
    self.dico_traduc_compet_travail[r].setMinimumWidth(280)
    self.dico_traduc_compet_travail[r].setMaximumHeight(54)
    self.dico_traduc_compet_travail[r].setMinimumHeight(54)
    # Création du combo pour sélection du domaine du socle
    self.dico_domaines_du_socle[r] = QComboBox()
    self.dico_domaines_du_socle[r].setMaximumWidth(240)
    self.dico_domaines_du_socle[r].setMinimumWidth(240)
    # ------------------------------
    self.dico_domaines_du_socle[r].addItems(liste_items_socle)
    # ------------------------------
    # Création des spinbox
    self.dico_spinbox_pts_chiffres[r] = QSpinBox()
    self.dico_spinbox_pts_chiffres[r].setRange(0, 60)
    # ------------------------------
    # Conditions de remplissage du combo (cycle 3 ou cycle 4) 
    # pour les compétences travaillées
    # ------------------------------
    # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
    if self.classe == 0 :
        message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
    elif self.classe == u'6' :
        self.dico_combo_compet_travail[r].addItems(liste_c_t_6e)
    elif self.classe in [u'5', u'4', u'3']: 
        self.dico_combo_compet_travail[r].addItems(liste_c_t_5e4e3e)
    # ------------------------------
    # Répartition dans la grille
    self.grille_3_stack_6.addWidget(self.dico_combo_compet_travail[r], r, 0)
    self.grille_3_stack_6.addWidget(self.dico_traduc_compet_travail[r], r, 1)
    self.grille_3_stack_6.addWidget(self.dico_domaines_du_socle[r], r, 2)
    self.grille_3_stack_6.addWidget(self.dico_spinbox_pts_chiffres[r], r, 3)
    # Ecriture des n°s de lignes
    self.dico_traduc_compet_travail[r].setText(str(r+1)+'. ')

    # Les données sont introduites dans une liste
    self.liste_compet_travail_socle_eval.append([self.dico_combo_compet_travail[r], self.dico_traduc_compet_travail[r], self.dico_domaines_du_socle[r], self.dico_spinbox_pts_chiffres[r]])

def supprimer_eval(self) :
    '''
    '''
    row = len(self.liste_compet_travail_socle_eval) - 1
    if row >= 0:
        for column in range(self.grille_3_stack_6.columnCount()):
            item = self.grille_3_stack_6.itemAtPosition(row, column)
            if item is not None:
                item.widget().deleteLater()
        del self.liste_compet_travail_socle_eval[row]
        del self.dico_combo_compet_travail[row]
        del self.dico_traduc_compet_travail[row]
        del self.dico_domaines_du_socle[row]
        del self.dico_spinbox_pts_chiffres[row]

完整代码在这里:https://pastebin.com/BqU1H70C .

界面截图:

enter image description here

当前代码根本没有优化(而且还是单个文件的形式)。

编辑:

感谢eyllanesc的回答,但仍然有问题。请看随附的屏幕截图:

enter image description here

编辑 2:

它非常有效 ekhumoro!

这是代码(我还添加了项目的工具提示):

def ajouter_eval(self) :
    '''
    '''
    # Liste des compétences travaillées en classe de 6ème
    liste_c_t_6e = [u"(E1) Choisir, organiser et mobiliser des gestes, des outils et des matériaux en fonction des effets qu'ils produisent.", ...] 
    # Liste des compétences travaillées pour les classes de 5ème, 4ème et 3ème
    liste_c_t_5e4e3e = [u"(E1) Choisir, mobiliser et adapter des langages et des moyens plastiques variés en fonction de leurs effets dans une intention artistique en restant attentif à l'inattendu.", ...]
    # Liste des items du domaine du socle
    liste_items_socle = [u"(D1-1-1-1) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Parler/communiquer/écouter", ...]
    #
    r = len(self.liste_compet_travail_socle_eval)
    # Création du combo pour sélection des compétences travaillées
    self.dico_combo_compet_travail[r] = QComboBox()
    # Les items de la combo sont affichés avec une barre de défilement
    # horizontale afin que tous les items ne soient pas tronqués dans la combo
    # ------------------------------
    # Un grand merci à ekhumoro pour la solution trouvée, à voir ici :
    # https://stackoverflow.com/questions/47569433/allow-horizontal-scrolling-in-a-qcombobox
    # ------------------------------
    vue_1 = QListView(self.dico_combo_compet_travail[r])
    self.dico_combo_compet_travail[r].setView(vue_1)
    vue_1.setTextElideMode(Qt.ElideNone)
    vue_1.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
    # ------------------------------
    # Dimensionnement de la combo
    self.dico_combo_compet_travail[r].setMaximumWidth(250)
    self.dico_combo_compet_travail[r].setMinimumWidth(250)
    # Création du QTextEdit
    self.dico_traduc_compet_travail[r] = QTextEdit()
    self.dico_traduc_compet_travail[r].setMaximumWidth(280)
    self.dico_traduc_compet_travail[r].setMinimumWidth(280)
    self.dico_traduc_compet_travail[r].setMaximumHeight(54)
    self.dico_traduc_compet_travail[r].setMinimumHeight(54)
    # Création du combo pour sélection du domaine du socle
    self.dico_domaines_du_socle[r] = QComboBox()
    # Voir commentaires plus haut ...
    # ------------------------------
    vue_2 = QListView(self.dico_domaines_du_socle[r])
    self.dico_domaines_du_socle[r].setView(vue_2)
    vue_2.setTextElideMode(Qt.ElideNone)
    vue_2.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
    # ------------------------------
    # Dimensionnement de la combo
    self.dico_domaines_du_socle[r].setMaximumWidth(240)
    self.dico_domaines_du_socle[r].setMinimumWidth(240)
    # ------------------------------
    self.dico_domaines_du_socle[r].addItems(liste_items_socle)
    # ------------------------------
    # Création des spinbox
    self.dico_spinbox_pts_chiffres[r] = QSpinBox()
    self.dico_spinbox_pts_chiffres[r].setRange(0, 60)
    # ------------------------------
    # Conditions de remplissage du combo (cycle 3 ou cycle 4) 
    # pour les compétences travaillées
    # ------------------------------
    # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
    if self.classe == 0 :
        message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
    elif self.classe == u'6' :
        self.dico_combo_compet_travail[r].addItems(liste_c_t_6e)
        # ------------------------------
        # ToolTips sur les items de la combo des compétences travaillées en 6ème (cycle 3)
        for ct_6_1, ct_6_2 in enumerate(liste_c_t_6e) :
            self.dico_combo_compet_travail[r].setItemData(ct_6_1, ct_6_2, Qt.ToolTipRole)
        # ------------------------------
    elif self.classe in [u'5', u'4', u'3']: 
        self.dico_combo_compet_travail[r].addItems(liste_c_t_5e4e3e)
        # ------------------------------
        # ToolTips sur les items de la combo des compétences travaillées en 5ème, 4ème et 3ème (cycle 4)
        for ct_543_1, ct_543_2 in enumerate(liste_c_t_5e4e3e) :
            self.dico_combo_compet_travail[r].setItemData(ct_543_1, ct_543_2, Qt.ToolTipRole)
    # ------------------------------
    # ToolTips sur les items du combo sélection du domaine du socle 
    for ds_1, ds_2 in enumerate(liste_items_socle) :
        self.dico_domaines_du_socle[r].setItemData(ds_1, ds_2, Qt.ToolTipRole)        
    # ------------------------------                
    # Répartition dans la grille
    self.grille_3_stack_6.addWidget(self.dico_combo_compet_travail[r], r, 0)
    self.grille_3_stack_6.addWidget(self.dico_traduc_compet_travail[r], r, 1)
    self.grille_3_stack_6.addWidget(self.dico_domaines_du_socle[r], r, 2)
    self.grille_3_stack_6.addWidget(self.dico_spinbox_pts_chiffres[r], r, 3)
    # Ecriture des n°s de lignes
    self.dico_traduc_compet_travail[r].setText(str(r+1)+'. ')

    # Les données sont introduites dans une liste
    self.liste_compet_travail_socle_eval.append([self.dico_combo_compet_travail[r], self.dico_traduc_compet_travail[r], self.dico_domaines_du_socle[r], self.dico_spinbox_pts_chiffres[r]])

屏幕截图:enter image description here

最佳答案

标准的QComboBox 使用自定义 View 来更改文本省略模式(除其他外)。因此,您必须将其重新设置为普通的 QListView 才能获得您想要的行为:

combo = QtGui.QComboBox()
view = QtGui.QListView(combo)
combo.setView(view)
# this must be done *after* re-setting the view
view.setTextElideMode(QtCore.Qt.ElideNone)
view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

关于python - 允许在 QComboBox 中水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47569433/

相关文章:

python - 如何在 Python 中使用 Win32 API?

python - Pyramid unicorn 和女服务员

python - 如何更改 QTextOption.ShowTabsAndSpaces 使用的字符?

python - 无法使用 sqlite 和 pyqt 将数据插入数据库

html - 删除显然不需要的垂直滚动条

python - 我可以从不同的目录运行 django 测试 (manage.py) 吗?

jquery - 通过 JQuery 提交表单并显示 JSON 文件中包含的结果

c++ - PyQt:获取QDockWidget的当前Qt.DockWidgetArea

java - 滚动条的原始 Java 2D 实现

css - 如何防止元素引起滚动