2012-08-10 19 views
5

Używając QComboBox z pyside, wiem jak podłączyć sygnał i użyć indeksu, który wysyła. Ale co z argumentem Unicode? Jeśli wolałbym połączyć się z czymś, co chce łańcucha z combobox, czy to możliwe?Przeciążone sygnały pyside (QComboBox)

Od: http://www.pyside.org/docs/pyside/PySide/QtGui/QComboBox.html#PySide.QtGui.QComboBox

istnieć Wszystkie trzy sygnały w dwóch wersjach, jedna z argumentem PySide.QtCore.QString i jednym z int argument.

Sygnały

def activated (arg__1) 
def activated (index) 

PySide.QtGui.QComboBox.activated (wskaźnik) Parametry: indeks - PySide.QtCore.int

PySide.QtGui.QComboBox.activated (arg_ 1) parametrów : arg _1 - unicode

Edycja: trochę kodu.

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

Ten kod daje mi indeks. Pytanie brzmiało, jak uzyskać ciąg znaków unicode wspomniany w dokumentach.

Odpowiedz

12

Nie rozumiem, co dokładnie jest twoje pytanie.

Istnieją dwie wersje sygnału QComboBox.activated. One podaje indeks wybranego elementu, a other one podaje jego tekst.

Aby wybrać pomiędzy nimi w PySide ty wykonaj następujące czynności:

a_combo_box.activated[int].connect(some_callable) 

a_combo_box.activated[str].connect(other_callable) 

Druga linia prawdopodobnie nie będzie działać w ten sposób w Pythonie 2, więc zastąpił str z unicode.

Zauważ, że używam ogólnym (C++) Qt dokumentacji, gdyż dokumentacja PySide jest nadal dość ambigous: Ciągle widząc te arg__1 s wszędzie ...
„tłumaczenia” na Pythonie nie powinno być zbyt trudne. Pamiętaj tylko, że QString staje się str (lub unicode w Pythonie 2, przy okazji, podoba mi się, że mój kod działa na wszystkich wersjach Pythona, więc zwykle robię typ aliasuw Py3 i unicode w Py2); long, short itd. Stają się int; double staje się float; QVariant jest całkowicie unikany, oznacza to tylko, że można tam przekazać dowolny typ danych; i tak dalej ...

2

Dzięki Oleh Prypin! Twoja odpowiedź pomogła mi, gdy natknąłem się na niejasny arg__1 w dokumentacji PySide.

Kiedy przetestowałem zarówno combo.currentIndexChanged [str], jak i combo.currentIndexChanged [unicode], każdy sygnał wysłał wersję indeksu bieżącego tekstu indeksu.

Oto przykład, który pokazuje zachowanie:

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

Wynikiem jest:

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

ja również potwierdziły, że basestring wygeneruje błąd IndexError: Signature currentIndexChanged(PyObject) not found for signal: currentIndexChanged. PySide wydaje się różnicować int, float (które określa jako double), str/unicode (oba stają unicode) i bool, ale wszystkie inne rodzaje python są analizowane jako PyObject w celu podpisów sygnałowych.

Mam nadzieję, że komuś pomóż!