Отправка текущего отображаемого индекса элемента в QComboBox при запуске - PullRequest
2 голосов
/ 12 июня 2019

Использование метода signal and slots для получения индекса и текста выбранных элементов в QcomboBox хорошо известно.Код ниже является иллюстрацией этого.Но как я могу сказать моему коду, чтобы он получал и отправлял первый элемент дисплея при запуске, Методы типа Activated, currentIndexChanged, Highlighted работают только по выпадающему списку QCombobox.

enter image description here

Выход:

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

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Попробуйте:

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_())
0 голосов
/ 12 июня 2019

Вы можете сделать свой собственный сигнал и излучать его в секции __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_())
...