Получить предыдущий и новый выбранный элемент при активации в QComboBox - PullRequest
0 голосов
/ 11 сентября 2018

В моей программе некоторые комбинированные списки (QComboBox) использовались для выполнения нескольких настроек. Иногда необходимо знать не только элемент, выбранный пользователем, но и элемент, который был выбран ранее в выпадающем списке. Ну, перенести новый выбор довольно просто:

self.MyCombobox.activated[str].connect(self.ComboChange)

Но как мне не только передать недавно выбранный, но и предыдущий элемент в функцию при изменении индекса?

Моим компромиссным решением было бы вручную установить переменную для каждого комбинированного списка, в котором хранится последнее выбранное значение, чтобы к нему можно было получить доступ при изменении выбора. Но, учитывая, что у меня много Combobox, это может привести к ошибкам, пока некоторые ящики не будут обновлены различными способами.

Заранее спасибо за помощь

Минимальный рабочий пример:

import sys

from PyQt5.QtWidgets import (   QApplication, QWidget, QGridLayout, QComboBox,
                                QLabel)

class BaseWidget(QWidget):
    def __init__(self):
        super(BaseWidget, self).__init__()
        self.setGeometry(300, 300, 300, 200)

        # 2 Labels to display the new and the old item after selection
        self.LabelOldItem = QLabel(self)
        self.LabelNewItem = QLabel(self)

        self.MyCombobox = QComboBox(self)
        self.MyCombobox.addItems(['Item 1', 'Item 2', 'Item 3', 'Item 4'])
        self.MyCombobox.activated[str].connect(self.ComboChange)


        grid = QGridLayout()
        grid.addWidget(self.MyCombobox, 0, 0, 1, 1)
        grid.addWidget(self.LabelOldItem, 1, 0, 1, 1)
        grid.addWidget(self.LabelNewItem, 2, 0, 1, 1)

        self.setLayout(grid)

    def ComboChange(self, newitem):
        self.LabelOldItem.setText('Previous Selection: ') # <- crucial point
        # How can i transfer both, not only the new item but also the previous
        # item of the combobox when it gets activated?
        self.LabelNewItem.setText('New Selection: <b>' + newitem + '</b>')


if __name__ == '__main__':

    app = QApplication(sys.argv)

    pyqtComboExample = BaseWidget()
    pyqtComboExample.show()
    sys.exit(app.exec_())

Minimal working example

1 Ответ

0 голосов
/ 11 сентября 2018

Возможное решение - создать собственный QComboBox:

import sys
from PyQt5 import QtCore, QtWidgets


class ComboBox(QtWidgets.QComboBox):
    new_signal = QtCore.pyqtSignal(str, str)

    def __init__(self, parent=None):
        super(ComboBox, self).__init__(parent)
        self.lastSelected = ""
        self.activated[str].connect(self.onActivated)

    def onActivated(self, text):
        self.new_signal.emit(self.lastSelected, text)
        self.lastSelected = text


class BaseWidget(QtWidgets.QWidget):
    def __init__(self):
        super(BaseWidget, self).__init__()
        self.setGeometry(300, 300, 300, 200)

        # 2 Labels to display the new and the old item after selection
        self.LabelOldItem = QtWidgets.QLabel()
        self.LabelNewItem = QtWidgets.QLabel()

        self.MyCombobox = ComboBox()
        self.MyCombobox.addItems(['Item 1', 'Item 2', 'Item 3', 'Item 4'])
        self.MyCombobox.new_signal.connect(self.ComboChange)

        grid = QtWidgets.QGridLayout(self)
        grid.addWidget(self.MyCombobox, 0, 0, 1, 1)
        grid.addWidget(self.LabelOldItem, 1, 0, 1, 1)
        grid.addWidget(self.LabelNewItem, 2, 0, 1, 1)

    def ComboChange(self, lastitem, newitem):
        self.LabelOldItem.setText('Previous Selection: <b>{}</b>'.format(lastitem))
        self.LabelNewItem.setText('New Selection: <b>{}</b>'.format(newitem))


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    pyqtComboExample = BaseWidget()
    pyqtComboExample.show()
    sys.exit(app.exec_())

Другое возможное решение - использовать sender() для получения используемого QComboBox и сохранить старый элемент в свойстве:

import sys
from PyQt5 import QtCore, QtWidgets


class BaseWidget(QtWidgets.QWidget):
    def __init__(self):
        super(BaseWidget, self).__init__()
        self.setGeometry(300, 300, 300, 200)

        # 2 Labels to display the new and the old item after selection
        self.LabelOldItem = QtWidgets.QLabel()
        self.LabelNewItem = QtWidgets.QLabel()

        self.MyCombobox = QtWidgets.QComboBox()
        self.MyCombobox.addItems(['Item 1', 'Item 2', 'Item 3', 'Item 4'])
        self.MyCombobox.activated[str].connect(self.ComboChange)

        grid = QtWidgets.QGridLayout(self)
        grid.addWidget(self.MyCombobox, 0, 0, 1, 1)
        grid.addWidget(self.LabelOldItem, 1, 0, 1, 1)
        grid.addWidget(self.LabelNewItem, 2, 0, 1, 1)

    def ComboChange(self, newitem):
        combo = self.sender()
        lastitem = combo.property("lastitem")
        self.LabelOldItem.setText('Previous Selection: <b>{}</b>'.format(lastitem))
        self.LabelNewItem.setText('New Selection: <b>{}</b>'.format(newitem))
        combo.setProperty("lastitem", newitem)


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    pyqtComboExample = BaseWidget()
    pyqtComboExample.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...