PYQT: qCombobox отображает имя столбца, но передает идентификатор столбца

Я очень старался заставить это работать, но до сих пор не нашел правильного маршрута. Я использую pyqt и запрашиваю базу данных MySql, собирая из нее модель со всеми столбцами. Пока здесь все хорошо..

Я создал поле со списком, которое отображает правильный текст, используя model.setcolumn(1). Теперь мне нужно, чтобы это поле со списком отправляло «активированный» относительный уникальный идентификатор этой записи, поэтому я могу создать отношение категории .

Каков наилучший способ сделать это? Я чувствую, что зашел в тупик, буду признателен за любую помощь.

Лучший, Крис


person user1028826    schedule 04.11.2011    source источник


Ответы (1)


Лучшим способом было бы создать подкласс QComboBox. Вы не можете переопределить сигнал activated, но вы можете создать собственный сигнал, который также будет испускаться с идентификатором всякий раз, когда испускается activated. И вы можете подключиться к этому сигналу и заниматься своими делами. Это будет примерно так:

class MyComboBox(QtGui.QComboBox):
    activatedId = QtCore.pyqtSignal(int) #correct this if your ID is not an int

    def __init__(self, parent=None):
        super(MyComboBox, self).__init__(parent)
        self.activated.connect(self.sendId)

    @QtCore.pyqtSlot(int)
    def sendId(self, index):
        model = self.model()
        uniqueIdColumn = 0 # if ID is elsewhere adjust
        uniqueId = model.data(model.createIndex(index,uniqueIdColumn,0),QtCore.Qt.DisplayRole)
        self.activatedId.emit(uniqueId)

Изменить Вот аналогичная версия без сигналов. Это вернет uniqueId всякий раз, когда вы вызываете sendId с index поля со списком.

class MyComboBox(QtGui.QComboBox):
    def __init__(self, parent=None):
        super(MyComboBox, self).__init__(parent)

    def sendId(self, index):
        model = self.model()
        uniqueIdColumn = 0 # if ID is elsewhere adjust
        uniqueId = model.data(model.createIndex(index,uniqueIdColumn,0),QtCore.Qt.DisplayRole)
        return uniqueId
person Avaris    schedule 04.11.2011
comment
Привет, большое спасибо за ваш ответ, я очень ценю это. Я реализовал этот класс в своем коде и вызываю MyComboBox.sendId(index) из моей активированной функции, однако я не получаю обратно уникальный идентификатор. Я думаю, что может быть что-то не так с uniqueId = model.data(model.cre.... Я печатаю uniqueId, но не получаю свой идентификационный номер... Я пытаюсь сделать это также сразу после объявления модели, чтобы узнать, он вернет значение, но он этого не делает (заменяет числовой индекс и т. д.) Любые идеи? - person user1028826; 04.11.2011
comment
@user1028826: user1028826: Я думал, вы имели в виду отношение «Сигнал/Слот». Если вы ищете обычную функцию/метод, см. мое редактирование. - person Avaris; 05.11.2011
comment
Еще раз спасибо Avaris за ваш ответ. Делать это таким образом кажется немного проще для начала, но я не получаю значение, когда я печатаю uniqueID, если я печатаю, я получаю объект ‹PyQt4.QtCore.QVariant по адресу 0x0000000003E542B8›. Нет ли более простого способа получить одно поле из таблицы или записи? - person user1028826; 17.11.2011
comment
@ user1028826: Это потому, что в Python 2.x PyQt возвращает переменные типа Qt. Вы можете изменить это поведение, адаптировав v2 API типы. Тогда все эти возвращаемые значения будут обычными типами Python. Или просто используйте любую из подходящих to* функций QVariant. Я считаю, что return uniqueId.toInt() справится с задачей (конечно, я предполагаю, что ваши идентификаторы являются целыми числами. Если нет, используйте подходящую функцию). Но я бы рекомендовал использовать API v2. - person Avaris; 17.11.2011
comment
Еще раз большое спасибо, я бы никогда не добрался до этого, если бы вы не рассказали мне последнее о v2 API. Я очень рад вашей помощи. - person user1028826; 17.11.2011
comment
Привет, возвращаясь к этому примеру. Сейчас я пытаюсь подключиться к сигналу на основе первого примера. Как я могу подключиться к сигналу, когда сигнал излучается? - person user1028826; 05.01.2012
comment
@ user1028826: Это то же самое, что и обычные сигналы. Просто есть метод, который может получить ваш идентификатор (скажем, self.doSomethingWithId) и подключить сигнал, используя self.myComboBoxInstance.sendId.connect(self.doSomethingWithId). - person Avaris; 05.01.2012