动态填充组合框 Qt

dynamically populate comboBox Qt

我正在尝试编写一个比较 xml 的小应用程序。但是,我很难做到 UI。我有一个触发 QFileDialog 的按钮。我接受字符串输入并填充一个组合框。不幸的是,组合框保持为空。当我对其进行硬编码时,它似乎可以工作。但是我无法让应用程序动态地执行它。有什么我想念的吗?

代码如下:

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())

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>

问题是语句 if (not fileDiag[0]):fileDialog[0] 是一个文本,如果我们将其评估为布尔值,则 return 对于任何文本都为真,除非它是空的,如果您拒绝它如果文本不为空则为 False,如果为空则为 True,这与您想要的相反:

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

一个解决方案是抑制 not:

if fileDiag[0]:
    [...]

但另一个解决方案是比较文本是否不为空,如下所示:

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