[PySide] QCombobox : Signal not emitted
Serge K.
skab12 at gmail.com
Tue Apr 10 17:57:53 CEST 2018
Ok, I found it!
Thank you really much Cristian! here the code (quite ugly :-)) for handling
the click:
self.cb.view().installEventFilter(self)
self.cb.view().viewport().installEventFilter(self)
def eventFilter(self, widget, event):
if event.type() == QEvent.MouseButtonRelease: # and
isinstance(widget, QComboBox):
print("--eventFilter() mouse_clicked on " + str(widget.objectName()))
print(widget.parent().parent().parent().view().currentIndex())
current_idx = self.cb.view().currentIndex().row()
self.cb.setCurrentIndex(current_idx)
self.cb.activated.emit(current_idx)
self.cb.hidePopup()
return False
return super(combodemo, self).eventFilter(widget, event)
Serge K.
On Tue, Apr 10, 2018 at 11:23 AM, Serge K. <skab12 at gmail.com> wrote:
> Ok, I see. Thank you really much for this information.
>
> Indeed, I want to add the clicking behavior for selecting an option.
> Highlighted was a quick test to see if it was working. I am surprised that
> keyboard events are implemented and not mouseEvents.
>
> If I add an eventFilter to my QCombobox for catching MouseButtonRelease
> event, how can I get the clicked option? Or Do you have an easier way to do
> that Cristian?
>
> self.cb.view().installEventFilter(self)
> self.cb.view().viewport().installEventFilter(self)
>
> def eventFilter(self, widget, event):
> if event.type() == QEvent.MouseButtonRelease:
> print("--eventFilter() mouse_clicked on " + str(widget.objectName()))
> my_idx =
> self.cb.setCurrentIndex(my_idx)
> return False
> return False
>
>
>
>
> On Tue, Apr 10, 2018 at 10:33 AM, Cristián Maureira-Fredes <
> Cristian.Maureira-Fredes at qt.io> wrote:
>
>> Hello Serge,
>>
>> I was using my keyboard to navigate the QComboBox options,
>> because hovering the options with the mouse just call the
>> highlighted slot.
>>
>> If you want to do something on highlighted, you can add for example the
>> following:
>>
>> def highlighted(self, i):
>> print("Highlighted: ", i)
>> self.cb.setCurrentIndex(i)
>>
>> In that way, when you move the mouse over the options,
>> the currentIndexChanged signal will be emitted.
>>
>> I don't know if you want a special behavior on this actions,
>> but remember to play around with mouseEvents if you want
>> to add clicking behavior.
>>
>> I'm Running Linux, Python 3.6.4 + PySide2 5.9
>>
>> Cheers
>>
>> ________________________________________
>> From: Serge K. <skab12 at gmail.com>
>> Sent: 10 April 2018 16:11:19
>> To: Cristián Maureira-Fredes
>> Cc: pyside at qt-project.org
>> Subject: Re: [PySide] QCombobox : Signal not emitted
>>
>> Thanks Cristian,
>>
>> This is the desired behavior but I do not get this result... That is
>> really weird... Can you tell me what is your environment?
>>
>> Me : windows 10 + anaconda python 3.6.4 + pyside2==5.9.0a1
>>
>>
>> On Apr 10, 2018 3:09 AM, "Cristián Maureira-Fredes" <
>> Cristian.Maureira-Fredes at qt.io<mailto:Cristian.Maureira-Fredes at qt.io>>
>> wrote:
>> Hello Serge,
>>
>> After executing your script, I get the following output:
>> https://pastebin.com/2L3VYR0n
>> I do get the output from `selectionchange` and `highlighted`,
>> is this not the desire behavior?
>>
>> Cheers
>>
>> ________________________________________
>> From: PySide <pyside-bounces+cristian.maureira-fredes=qt.io at qt-project.
>> org<mailto:qt.io at qt-project.org>> on behalf of Serge K. <skab12 at gmail.com
>> <mailto:skab12 at gmail.com>>
>> Sent: 09 April 2018 22:46:32
>> To: pyside at qt-project.org<mailto:pyside at qt-project.org>
>> Subject: [PySide] QCombobox : Signal not emitted
>>
>>
>> Hi Everyone,
>>
>> After setting a custom model on QCombobox, I do not receive anymore
>> currentIndexChanged signal from my QCombobox (look below as an example) Did
>> I do something wrong?
>>
>>
>> from PySide2.QtCore import *
>> from PySide2.QtGui import *
>> from PySide2.QtWidgets import *
>>
>>
>> class CustomModel(QAbstractListModel):
>> """ Protocol model """
>>
>> def __init__(self, *args, **kwargs):
>> super(CustomModel, self).__init__(*args, **kwargs)
>>
>> self._protocol_list = []
>>
>> def add_protocol(self, data, row=0):
>> if not row:
>> row = len(self._protocol_list)
>>
>> self.beginInsertRows(QModelIndex(), row, row)
>> self._protocol_list.insert(row, data)
>> self.endInsertRows()
>> return self.index(len(self._protocol_list) - 1)
>>
>> def remove_protocol(self, item):
>> for row, data in enumerate(self._protocol_list):
>> if data.name.lower() == item.name.lower():
>> self.beginRemoveRows(QModelIndex(), row, row)
>> self._protocol_list.pop(row)
>> self.endRemoveRows()
>>
>> def rowCount(self, parent=QModelIndex()):
>> if parent.isValid():
>> return 0
>> return len(self._protocol_list)
>>
>>
>> def insertRows(self, row, count, index=QModelIndex()):
>> self.beginInsertRows(QModelIndex(), row, row + count - 1)
>>
>> for j in range(row, row + count):
>> self._protocol_list.insert(j, None)
>>
>> self.endInsertRows()
>> return True
>>
>> def removeRows(self, row, count, index=QModelIndex()):
>> self.beginRemoveRows(QModelIndex(), row, row + count - 1)
>>
>> for j in range(row, row + count)[::-1]:
>> self._protocol_list.pop(j)
>>
>> self.endRemoveRows()
>> return True
>>
>> def headerData(self, section, orientation, role=Qt.EditRole):
>> return None
>>
>> def data(self, index, role=Qt.DisplayRole):
>> if not index.isValid():
>> return None
>>
>> current_protocol = self._protocol_list[index.row()]
>>
>> if role == Qt.DisplayRole or role == Qt.EditRole:
>> return current_protocol[0]
>>
>> return None
>>
>> def setData(self, index, value, role=Qt.EditRole):
>> if role != Qt.EditRole:
>> return True
>>
>> if index.isValid() and 0 <= index.row() <
>> len(self._protocol_list):
>> current_protocol = self._protocol_list[index.row()]
>> if index.column() == 0:
>> current_protocol[0] = value
>>
>> self.dataChanged.emit(index, index)
>> return True
>>
>> return False
>>
>> def flags(self, index):
>> if index.isValid():
>> return Qt.ItemFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable)
>> return QAbstractListModel.flags(index)
>>
>>
>> class combodemo(QWidget):
>> def __init__(self, parent=None):
>> super(combodemo, self).__init__(parent)
>>
>> layout = QHBoxLayout()
>> self.cb = QComboBox()
>> self.model = CustomModel()
>> self.cb.setModel(self.model)
>> self.cb.setModelColumn(0)
>> self.model.add_protocol(("c", "A"))
>> self.model.add_protocol(("c++", "B"))
>> self.model.add_protocol(("Java", "C"))
>> self.model.add_protocol(("C#", "D"))
>> self.model.add_protocol(("Python", "E"))
>>
>> self.cb.currentIndexChanged.connect(self.selectionchange)
>> self.cb.highlighted.connect(self.highlighted)
>>
>> layout.addWidget(self.cb)
>> self.setLayout(layout)
>> self.setWindowTitle("combo box demo")
>>
>> def highlighted(self, i):
>> print("Highlighted: ", i)
>>
>> def selectionchange(self, i):
>> print("Items in the list are :")
>>
>> for count in range(self.cb.count()):
>> print(self.cb.itemText(count))
>> print("Current index", i, "selection changed ",
>> self.cb.currentText())
>>
>>
>>
>> def main():
>> app = QApplication(sys.argv)
>> ex = combodemo()
>> ex.show()
>> sys.exit(app.exec_())
>>
>>
>> if __name__ == '__main__':
>> main()
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20180410/0e73199e/attachment.html>
More information about the PySide
mailing list