<div>I mentioned this problem two times before ,I think you should fix this problem as soon as possible , because it conflict with Python's function signature ,which may lead more and more Python programers run into this issue .</div><div><div><br></div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ 原始邮件 ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>发件人:</b> "phil";<phil@riverbankcomputing.com>;</div><div><b>发送时间:</b> 2014年1月11日(星期六) 上午6:59</div><div><b>收件人:</b> "pyqt"<pyqt@riverbankcomputing.com>; <wbr></div><div></div><div><b>主题:</b> Re: [PyQt] Bug Report: pyqt5 discard silently signal with missingoptional parameters (dataChanged roles for example)</div></div><div><br></div>On 10-01-2014 10:08 pm, Baptiste Lepilleur wrote:<br>> The issue is demonstrated in the attached example (pyqt 5.2, python<br>> 3.3). Below is the relevant excerpt:<br>><br>> class ListModel(QAbstractItemModel):<br>>     def __init__(self, parent=None):<br>>         super(ListModel, self).__init__(parent)<br>><br>>     def testEmit(self):<br>>         # This signal is silently dropped by pyqt (missing<br>> optional 3rd parameters). Why?<br>>         self.dataChanged.emit(self.createIndex(1,0),<br>> QModelIndex())<br>>         # This signal is sent as expected<br>>         self.dataChanged.emit(self.createIndex(2,0),<br>> QModelIndex(), [])<br>><br>> * Bug description:<br>><br>> The signal QAbstractItemModel::dataChanged has the following<br>> signature:<br>> void QAbstractItemModel::dataChanged(<br>>     const QModelIndex & topLeft, <br>>     const QModelIndex & bottomRight, <br>>     const QVector<int> & roles = QVector<int> ())<br>><br>> If the optional roles parameters is not given when calling emit, the<br>> signal emission is discarded without any error reporting.<br>><br>> For example:<br>><br>>         self.dataChanged.emit(self.createIndex(1,0),<br>> QModelIndex())<br>><br>> Below is the output of the attached example showing that the expected<br>> first emit "onDataChanged 1" is missing:<br>><br>> C:Python33python.exe debugemit.py<br>>  onDataChanged 2<br>> ------------done-------------<br>><br>> * Work-around:<br>><br>> Pass the optional roles signal parameter:<br>><br>>         self.dataChanged.emit(self.createIndex(2,0),<br>> QModelIndex(), [])<br>><br>> * Remarks:<br>><br>> This bug usually goes unseen because the views are usually<br>> automatically refreshed if the mouse if moved over the view <br>> associated<br>> to the model.<br>><br>> It was exposed by a model shared by multiple editable views with a<br>> custom setData(). It took many hours to figure out the root cause of<br>> the lack of refresh.<br>><br>> IMHO a fairly serious bug as Ive never seen an example of<br>> dataChanged.emit() with the roles parameter...<br>><br>> Lets me know if the above is unclear or more details are required, Id<br>> hate to see anyone else losing time on this issue,<br>> Baptiste.<br><br>Qt signals with an optional argument are actually implemented as two <br>separate signals. One with the argument and one without it. PyQt treats <br>the first as the default (ie. the one that doesn't require an explicit <br>signature to select it). PyQt 5.2 included a change that meant you <br>didn't have to specify an explicit signature to emit() because it works <br>out the one you mean by the number of arguments you have passed to it.  <br>connect() cannot do the same thing because it doesn't have the <br>information. You are only connecting the default signal - there is no <br>connection made to the 2 argument signal, so your first call to emit() <br>is ignored.<br><br>I'll have a think to see if I can find some way to make it work more <br>naturally.<br><br>Phil<br>_______________________________________________<br>PyQt mailing list    PyQt@riverbankcomputing.com<br>http://www.riverbankcomputing.com/mailman/listinfo/pyqt</div>