【问题标题】:Sending the current displayed index of item in QComboBox at start up在启动时发送 QComboBox 中项目的当前显示索引
【发布时间】:2019-10-26 10:19:01
【问题描述】:

使用signal and slots 方法获取QcomboBox 中选定项目的索引和文本是众所周知的。下面的代码就是一个例子。但是我如何告诉我的代码在启动时接收和发送第一个显示项,Activated, currentIndexChanged, Highlighted 之类的方法只能通过下拉列表QCombobox 工作。

输出:

1
item2
2
item3

示例代码:

from PyQt5 import QtCore, QtWidgets, QtGui

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setLayout(QtWidgets.QVBoxLayout())
        combo = QtWidgets.QComboBox(self)
        self.layout().addWidget(combo)
        combo.addItems(["item1", "item2", "item3"])
        combo.setMinimumWidth(150)
        combo.activated[int].connect(self.onActivatedIndex)
        combo.activated[str].connect(self.onActivatedText)

    @QtCore.pyqtSlot(int)
    def onActivatedIndex(self, index):
        print(index)

    @QtCore.pyqtSlot(str)
    def onActivatedText(self, text):
        print(text)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5 signals-slots qcombobox


    【解决方案1】:

    您可以制作自己的自定义信号并在对象的__init__ 部分发出该信号。然后,此信号可以访问QComboBox 中的第一项。另一种方法可能是使用 singleShot 计时器,但制作自定义信号可能会更好。您可以使用currentIndex()currentText() 检索当前索引。

    from PyQt5 import QtCore, QtWidgets, QtGui
    
    class Widget(QtWidgets.QWidget):
        startup = QtCore.pyqtSignal()
    
        def __init__(self, parent=None):
            QtWidgets.QWidget.__init__(self, parent)
            self.setLayout(QtWidgets.QVBoxLayout())
            self.combo = QtWidgets.QComboBox(self)
            self.layout().addWidget(self.combo)
            self.combo.addItems(["item1", "item2", "item3"])
            self.combo.setMinimumWidth(150)
            self.combo.activated[int].connect(self.onActivatedIndex)
            self.combo.activated[str].connect(self.onActivatedText)
    
            self.startup.connect(self.current_index)
            self.startup.emit()
    
        @QtCore.pyqtSlot()
        def current_index(self):
            print(self.combo.currentIndex())
            print(self.combo.currentText())
    
        @QtCore.pyqtSlot(int)
        def onActivatedIndex(self, index):
            print(index)
    
        @QtCore.pyqtSlot(str)
        def onActivatedText(self, text):
            print(text)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      试试看:

      from PyQt5 import QtCore, QtWidgets, QtGui
      
      class Widget(QtWidgets.QWidget):
          def __init__(self, parent=None):
              QtWidgets.QWidget.__init__(self, parent)
              self.setLayout(QtWidgets.QVBoxLayout())
              self.combo = QtWidgets.QComboBox(self)
              self.layout().addWidget(self.combo)
              self.combo.addItems(["item1", "item2", "item3"])
              self.combo.setMinimumWidth(150)
      
              self.combo.activated[int].connect(self.onActivatedIndex)
              self.combo.activated[str].connect(self.onActivatedText)
      
              self.combo.activated.emit(1)                           # <---
      
          @QtCore.pyqtSlot(int)
          def onActivatedIndex(self, index):
              print("\nindex->", index)
              print("text ->", self.combo.itemText(index))
      
          @QtCore.pyqtSlot(str)
          def onActivatedText(self, text):
              print(text)
      
      if __name__ == '__main__':
          import sys
          app = QtWidgets.QApplication(sys.argv)
          w = Widget()
          w.show()
          sys.exit(app.exec_())
      

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        相关资源
        最近更新 更多