Перегруженные сигналы pyside (QComboBox)

Используя QComboBox с pyside, я знаю, как подключить сигнал и использовать индекс, который он отправляет. Но как насчет аргумента unicode? Если я предпочитаю подключиться к чему-то, что требует строку из поля со списком, возможно ли это?

Откуда: http://www.pyside.org/docs/pyside/PySide/QtGui/QComboBox.html#PySide.QtGui.QComboBox

Все три сигнала существуют в двух версиях: одна с аргументом PySide.QtCore.QString и одна с аргументом int.

Сигналы

def activated (arg__1)
def activated (index)

PySide.QtGui.QComboBox.activated(index) Параметры: index — PySide.QtCore.int

PySide.QtGui.QComboBox.activated(arg_1) Параметры: arg_1 — юникод

Изменить: некоторый код.

le = ComboBoxIpPrefix()
le.currentIndexChanged.connect(lambda x....)

Этот код дает мне index. Вопрос заключался в том, как получить строку юникода, упомянутую в документах.


person user985366    schedule 10.08.2012    source источник


Ответы (2)


Я не понимаю, в чем именно заключается ваш вопрос.

Есть две версии сигнала QComboBox.activated. One дает вам индекс выбранного элемента, другой дает вам свой текст.

Чтобы выбрать между ними в PySide, вы делаете следующее:

a_combo_box.activated[int].connect(some_callable)

a_combo_box.activated[str].connect(other_callable)

Вторая строка, вероятно, не будет работать таким образом в Python 2, поэтому замените str на unicode.

Обратите внимание, что я использую общую (C++) документацию Qt, потому что документация PySide по-прежнему довольно неоднозначна: я повсюду видел эти arg__1...
«Перевод» на Python не должен быть слишком сложным. Просто имейте в виду, что QString становится str (или unicode в Python 2; кстати, мне нравится, когда мой код работает во всех версиях Python, поэтому я обычно создаю псевдоним типа text, который равен str в Py3 и unicode в Py2); long, short и т. д. становятся int; double становится float; QVariant полностью избегается, это просто означает, что туда можно передать любой тип данных; и так далее...

person Oleh Prypin    schedule 10.08.2012

Спасибо Олегу Припину! Ваш ответ помог мне, когда я наткнулся на непонятный arg__1 в документации PySide.

Когда я тестировал как combo.currentIndexChanged[str], так и combo.currentIndexChanged[unicode], каждый сигнал отправлял unicode-версию текущего текста индекса.

Вот пример, демонстрирующий поведение:

from PySide import QtCore
from PySide import QtGui

class myDialog(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super(myDialog, self).__init__(*args, **kwargs)

        combo = QtGui.QComboBox()
        combo.addItem('Dog', 'Dog')
        combo.addItem('Cat', 'Cat')

        layout = QtGui.QVBoxLayout()
        layout.addWidget(combo)

        self.setLayout(layout)

        combo.currentIndexChanged[int].connect(self.intChanged)
        combo.currentIndexChanged[str].connect(self.strChanged)
        combo.currentIndexChanged[unicode].connect(self.unicodeChanged)

        combo.setCurrentIndex(1)

    def intChanged(self, index):
        print "Combo Index: "
        print index
        print type(index)

    def strChanged(self, value):
        print "Combo String:"
        print type(value)
        print value

    def unicodeChanged(self, value):
        print "Combo Unicode String:"
        print type(value)
        print value

if __name__ == "__main__":

    app = QtGui.QApplication([])
    dialog = myDialog()
    dialog.show()
    app.exec_()

В результате получается:

Combo Index
1
<type 'int'>
Combo String
<type 'unicode'>
Cat
Combo Unicode String
<type 'unicode'>
Cat

Я также подтвердил, что basestring выдаст ошибку IndexError: Signature currentIndexChanged(PyObject) not found for signal: currentIndexChanged. Похоже, что PySide различает int, float (которые он называет double), str/unicode (которые оба становятся unicode) и bool, но все остальные типы python анализируются как PyObject для целей сигнатур сигналов.

Надеюсь, это поможет кому-то!

person flutefreak7    schedule 25.02.2014