2017-10-10 7 views
0

J'essaie d'écrire une petite application qui compare xml. Mais j'ai du mal à faire l'interface. J'ai un bouton qui déclenche un QFileDialog. Je prends l'entrée de chaîne et remplis une combobox. Malheureusement, la liste déroulante reste vide. Cela semble fonctionner quand je le code en dur. Mais je suis incapable d'obtenir l'application pour le faire dynamiquement. Y a-t-il quelque chose qui me manque?dynamiquement peupler comboBox Qt

Voici le code:

import sys 
from qtpy import QtCore, QtWidgets, uic 
from qtpy.QtWidgets import QMainWindow, QApplication, QFileDialog 
from qtpy.QtCore import QObject 

class CompareSiteAndRepoWindow(QMainWindow): 

    def __init__(self): 
     super(CompareSiteAndRepoWindow,self).__init__() 
     uic.loadUi('CompareSiteAndRepo.ui',self) 
     self.BrowseLRPath.clicked.connect(self.browseFile) 
     self.buttonBox.rejected.connect(self.reject) 

     self.show() 

    def reject(self): 
     self.close() 

    def browseFile(self): 

     fileDiag = QFileDialog.getOpenFileName(self, 'Open file', 
    'c:\\',"xml/html (*.xml *.html)") 

     if(not fileDiag[0]): 
      print(fileDiag[0]) 
      self.LRPathComboBox.addItem(fileDiag[0],0) 



if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    window = CompareSiteAndRepoWindow() 

    sys.exit(app.exec()) 

le fichier CompareSiteAndRepo.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>CompareLabToSiteDLG</class> 
<widget class="QMainWindow" name="CompareLabToSiteDLG"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>316</width> 
    <height>262</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralwidget"> 
    <layout class="QGridLayout" name="gridLayout"> 
    <item row="0" column="0"> 
    <layout class="QVBoxLayout" name="verticalLayout"> 
     <item> 
     <widget class="QLabel" name="LRLabel"> 
     <property name="text"> 
     <string>Load Report</string> 
     </property> 
     </widget> 
     </item> 
     <item> 
     <widget class="QSplitter" name="splitter"> 
     <property name="orientation"> 
     <enum>Qt::Horizontal</enum> 
     </property> 
     <widget class="QComboBox" name="LRPathComboBox"/> 
     <widget class="QPushButton" name="BrowseLRPath"> 
     <property name="text"> 
      <string>Browse</string> 
     </property> 
     </widget> 
     </widget> 
     </item> 
     <item> 
     <widget class="QLabel" name="LP2Label"> 
     <property name="text"> 
     <string>LaunchPadData repo layout</string> 
     </property> 
     </widget> 
     </item> 
     <item> 
     <widget class="QSplitter" name="splitter_2"> 
     <property name="orientation"> 
     <enum>Qt::Horizontal</enum> 
     </property> 
     <widget class="QComboBox" name="LP2RepoPath"/> 
     <widget class="QPushButton" name="BrowseLP2RepoPath"> 
     <property name="text"> 
      <string>Browse</string> 
     </property> 
     </widget> 
     </widget> 
     </item> 
     <item> 
     <widget class="QDialogButtonBox" name="buttonBox"> 
     <property name="standardButtons"> 
     <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> 
     </property> 
     </widget> 
     </item> 
    </layout> 
    </item> 
    </layout> 
    </widget> 
    <widget class="QMenuBar" name="menubar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>316</width> 
    <height>26</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QStatusBar" name="statusbar"/> 
</widget> 
<resources/> 
<connections/> 
</ui> 

Répondre

0

le problème est la déclaration if (not fileDiag[0]):, fileDialog[0] est un texte que si nous évaluons comme booléen retourne vrai pour tout texte sauf qu'il est vide et si vous le refusez, il sera Faux si le texte n'est pas vide ou Vrai si c'est le cas, ce qui est contraire à ce que vous voulez:

fileDiag[0] not fileDiag[0] 
+--------------+--------------+ 
""    True 
"some text"  False 

Une solution consiste à supprimer la non:

if fileDiag[0]: 
    [...] 

Mais une autre solution est de comparer si le texte n'est pas vide comme je le montre ci-dessous:

def browseFile(self): 
    filename, _ = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\',"xml/html (*.xml *.html)") 
    if filename != "": 
     self.LRPathComboBox.addItem(filename, 0)