<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="markdown-here-wrapper" data-md-url="Thunderbird"
style="" markdown-here-wrapper-content-modified="true">
<p style="margin: 0px 0px 1.2em !important;">Hi all,</p>
<p style="margin: 0px 0px 1.2em !important;">I have a simple
QListView in which I would like to edit items by clicking into
empty space, typing, then hitting either enter or tab.<br>
I’d like the tab Key_Tab event to behave exactly like Key_Enter
event, but it’s a bit stubborn.<br>
When I hit tab while editing an item (i.e. editor is open), the
first item in the list is selected.</p>
<p style="margin: 0px 0px 1.2em !important;">I noticed that when
hitting the tab key in an open editor only a
QtCore.QEvent.ShortcutOverride is triggered.<br>
It looks like I can simply react to that in my situation though
I’m not sure if that is wise?!<br>
If I do, how would I manually emit an event that looks like a
Key_Enter event?</p>
<p style="margin: 0px 0px 1.2em !important;">Otherwise, how can I
avoid above behaviour for the tab key and make it behave like a
regular key (I assume it’s trying to change focus in the focus
chain but don’t know how to make it stop)?</p>
<p style="margin: 0px 0px 1.2em !important;">Here is some example
code to show my problem.</p>
<p style="margin: 0px 0px 1.2em !important;">Cheers,<br>
frank<br>
</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-python" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; background: rgb(63, 63, 63) none repeat scroll 0% 0%; color: rgb(220, 220, 220); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">class</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">AddresseeDelegate</span><span class="hljs-params">(QtWidgets.QItemDelegate)</span>:</span>
is_valid = QtCore.Signal()
is_not_valid = QtCore.Signal(QtCore.QModelIndex)
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">__init__</span><span class="hljs-params">(self, users=[], groups=[], parent=None)</span>:</span>
super(AddresseeDelegate, self).__init__(parent)
self.valid_item_texts = [u[<span class="hljs-string" style="color: rgb(204, 147, 147);">'name'</span>] <span class="hljs-keyword" style="color: rgb(227, 206, 171);">for</span> u <span class="hljs-keyword" style="color: rgb(227, 206, 171);">in</span> users] + [g[<span class="hljs-string" style="color: rgb(204, 147, 147);">'code'</span>] <span class="hljs-keyword" style="color: rgb(227, 206, 171);">for</span> g <span class="hljs-keyword" style="color: rgb(227, 206, 171);">in</span> groups]
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">createEditor</span><span class="hljs-params">(self, parent, option, index)</span>:</span>
self.editor = QtWidgets.QLineEdit(parent)
self.editor.setMinimumWidth(<span class="hljs-number" style="color: rgb(140, 208, 211);">100</span>)
completer = QtWidgets.QCompleter(self.valid_item_texts)
completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
completer.setCompletionMode(QtWidgets.QCompleter.InlineCompletion)
self.editor.setCompleter(completer)
self.editor.editingFinished.connect(<span class="hljs-keyword" style="color: rgb(227, 206, 171);">lambda</span>: self.validate_text(index))
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">return</span> self.editor
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">setModelData</span><span class="hljs-params">(self, editor, model, index)</span>:</span>
model.setData(index, editor.text())
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">validate_text</span><span class="hljs-params">(self, index=None)</span>:</span>
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">if</span> self.editor.text() <span class="hljs-keyword" style="color: rgb(227, 206, 171);">in</span> self.valid_item_texts:
<span class="hljs-comment" style="color: rgb(127, 159, 127);"># valid input</span>
self.commitData.emit(self.editor)
self.closeEditor.emit(self.editor)
self.is_valid.emit()
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">else</span>:
<span class="hljs-comment" style="color: rgb(127, 159, 127);"># invalid input</span>
self.closeEditor.emit(self.editor)
self.is_not_valid.emit(index)
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">class</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">AddresseeListView</span><span class="hljs-params">(QtWidgets.QListView)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">__init__</span><span class="hljs-params">(self, users=[], groups=[], parent=None)</span>:</span>
<span class="hljs-string" style="color: rgb(204, 147, 147);">'''Simple addressee widget.'''</span>
super(AddresseeListView, self).__init__(parent)
self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.setFlow(QtWidgets.QListView.LeftToRight)
self.setResizeMode(QtWidgets.QListView.ResizeMode.Adjust)
self.setSpacing(<span class="hljs-number" style="color: rgb(140, 208, 211);">10</span>)
self.setViewMode(QtWidgets.QListView.IconMode)
<span class="hljs-comment" style="color: rgb(127, 159, 127);">#self.setWrapping(True)</span>
<span class="hljs-comment" style="color: rgb(127, 159, 127);"># delegate</span>
delegate = AddresseeDelegate(users, groups)
self.setItemDelegate(delegate)
delegate.is_not_valid.connect(self.delete_invalid_index)
<span class="hljs-comment" style="color: rgb(127, 159, 127);"># model</span>
model = QtGui.QStandardItemModel()
<span class="hljs-comment" style="color: rgb(127, 159, 127);">#model = Model()</span>
self.setModel(model)
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">event</span><span class="hljs-params">(self, event)</span>:</span>
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">if</span> event.type() == QtCore.QEvent.ShortcutOverride:
<span class="hljs-comment" style="color: rgb(127, 159, 127);"># need to emit a Key_Enter event here</span>
event.accept()
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">return</span> super(AddresseeListView, self).event(event)
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">mousePressEvent</span><span class="hljs-params">(self, event)</span>:</span>
self.add_and_edit()
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">add_and_edit</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-string" style="color: rgb(204, 147, 147);">'''Add a new row and open editor'''</span>
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">print</span> <span class="hljs-string" style="color: rgb(204, 147, 147);">'adding row'</span>
new_item = QtGui.QStandardItem(<span class="hljs-string" style="color: rgb(204, 147, 147);">''</span>)
self.model().appendRow(new_item)
self.edit(self.model().indexFromItem(new_item))
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(227, 206, 171);">def</span> <span class="hljs-title" style="color: rgb(239, 239, 143);">delete_invalid_index</span><span class="hljs-params">(self, index)</span>:</span>
<span class="hljs-string" style="color: rgb(204, 147, 147);">'''Remove invalid entry'''</span>
self.model().removeRow(index.row())
<span class="hljs-keyword" style="color: rgb(227, 206, 171);">if</span> __name__ == <span class="hljs-string" style="color: rgb(204, 147, 147);">'__main__'</span>:
app = QtWidgets.QApplication(sys.argv)
users = [{<span class="hljs-string" style="color: rgb(204, 147, 147);">'name'</span>:<span class="hljs-string" style="color: rgb(204, 147, 147);">'aa'</span>}, {<span class="hljs-string" style="color: rgb(204, 147, 147);">'name'</span>:<span class="hljs-string" style="color: rgb(204, 147, 147);">'bb'</span>}]
groups = [{<span class="hljs-string" style="color: rgb(204, 147, 147);">'code'</span>:<span class="hljs-string" style="color: rgb(204, 147, 147);">'cc'</span>}, {<span class="hljs-string" style="color: rgb(204, 147, 147);">'code'</span>:<span class="hljs-string" style="color: rgb(204, 147, 147);">'dd'</span>}]
w = AddresseeListView(users, groups)
w.show()
w.raise_()
app.exec_()
</code></pre>
<div
title="MDH:SGkgYWxsLDxicj48YnI+SSBoYXZlIGEgc2ltcGxlIFFMaXN0VmlldyBpbiB3aGljaCBJIHdvdWxkIGxpa2UgdG8gZWRpdCBpdGVtcyBieSBjbGlja2luZyBpbnRvIGVtcHR5IHNwYWNlLCB0eXBpbmcs
IHRoZW4gaGl0dGluZyBlaXRoZXIgZW50ZXIgb3IgdGFiLjxicj5JJ2QgbGlrZSB0aGUgdGFiIEtl
eV9UYWIgZXZlbnQgdG8gYmVoYXZlIGV4YWN0bHkgbGlrZSBLZXlfRW50ZXIgZXZlbnQsIGJ1dCBp
dCdzIGEgYml0IHN0dWJib3JuLjxicj5XaGVuIEkgaGl0IHRhYiB3aGlsZSBlZGl0aW5nIGFuIGl0
ZW0gKGkuZS4gZWRpdG9yIGlzIG9wZW4pLCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyBz
ZWxlY3RlZC48YnI+PGJyPkkgbm90aWNlZCB0aGF0IHdoZW4gaGl0dGluZyB0aGUgdGFiIGtleSBp
biBhbiBvcGVuIGVkaXRvciBvbmx5IGEgUXRDb3JlLlFFdmVudC5TaG9ydGN1dE92ZXJyaWRlIGlz
IHRyaWdnZXJlZC48YnI+SXQgbG9va3MgbGlrZSBJIGNhbiBzaW1wbHkgcmVhY3QgdG8gdGhhdCBp
biBteSBzaXR1YXRpb24gdGhvdWdoIEknbSBub3Qgc3VyZSBpZiB0aGF0IGlzIHdpc2U/ITxicj5J
ZiBJIGRvLCBob3cgd291bGQgSSBtYW51YWxseSBlbWl0IGFuIGV2ZW50IHRoYXQgbG9va3MgbGlr
ZSBhIEtleV9FbnRlciBldmVudD88YnI+PGJyPk90aGVyd2lzZSwgaG93IGNhbiBJIGF2b2lkIGFi
b3ZlIGJlaGF2aW91ciBmb3IgdGhlIHRhYiBrZXkgYW5kIG1ha2UgaXQgYmVoYXZlIGxpa2UgYSBy
ZWd1bGFyIGtleSAoSSBhc3N1bWUgaXQncyB0cnlpbmcgdG8gY2hhbmdlIGZvY3VzIGluIHRoZSBm
b2N1cyBjaGFpbiBidXQgZG9uJ3Qga25vdyBob3cgdG8gbWFrZSBpdCBzdG9wKS48YnI+PGJyPmBg
YHB5dGhvbjxicj5jbGFzcyBBZGRyZXNzZWVEZWxlZ2F0ZShRdFdpZGdldHMuUUl0ZW1EZWxlZ2F0
ZSk6PGJyPsKgwqDCoCBpc192YWxpZCA9IFF0Q29yZS5TaWduYWwoKTxicj7CoMKgwqAgaXNfbm90
X3ZhbGlkID0gUXRDb3JlLlNpZ25hbChRdENvcmUuUU1vZGVsSW5kZXgpPGJyPjxicj7CoMKgwqAg
ZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJzPVtdLCBncm91cHM9W10sIHBhcmVudD1Ob25lKTo8YnI+
wqDCoMKgwqDCoMKgwqAgc3VwZXIoQWRkcmVzc2VlRGVsZWdhdGUsIHNlbGYpLl9faW5pdF9fKHBh
cmVudCk8YnI+wqDCoMKgwqDCoMKgwqAgc2VsZi52YWxpZF9pdGVtX3RleHRzID0gW3VbJ25hbWUn
XSBmb3IgdSBpbiB1c2Vyc10gKyBbZ1snY29kZSddIGZvciBnIGluIGdyb3Vwc108YnI+PGJyPsKg
wqDCoCBkZWYgY3JlYXRlRWRpdG9yKHNlbGYsIHBhcmVudCwgb3B0aW9uLCBpbmRleCk6PGJyPsKg
wqDCoMKgwqDCoMKgIHNlbGYuZWRpdG9yID0gUXRXaWRnZXRzLlFMaW5lRWRpdChwYXJlbnQpPGJy
PsKgwqDCoMKgwqDCoMKgIHNlbGYuZWRpdG9yLnNldE1pbmltdW1XaWR0aCgxMDApPGJyPsKgwqDC
oMKgwqDCoMKgIGNvbXBsZXRlciA9IFF0V2lkZ2V0cy5RQ29tcGxldGVyKHNlbGYudmFsaWRfaXRl
bV90ZXh0cyk8YnI+wqDCoMKgwqDCoMKgwqAgY29tcGxldGVyLnNldENhc2VTZW5zaXRpdml0eShR
dENvcmUuUXQuQ2FzZUluc2Vuc2l0aXZlKTxicj7CoMKgwqDCoMKgwqDCoCBjb21wbGV0ZXIuc2V0
Q29tcGxldGlvbk1vZGUoUXRXaWRnZXRzLlFDb21wbGV0ZXIuSW5saW5lQ29tcGxldGlvbik8YnI+
wqDCoMKgwqDCoMKgwqAgc2VsZi5lZGl0b3Iuc2V0Q29tcGxldGVyKGNvbXBsZXRlcik8YnI+wqDC
oMKgwqDCoMKgwqAgc2VsZi5lZGl0b3IuZWRpdGluZ0ZpbmlzaGVkLmNvbm5lY3QobGFtYmRhOiBz
ZWxmLnZhbGlkYXRlX3RleHQoaW5kZXgpKTxicj7CoMKgwqDCoMKgwqDCoCByZXR1cm4gc2VsZi5l
ZGl0b3I8YnI+PGJyPsKgwqDCoCBkZWYgc2V0TW9kZWxEYXRhKHNlbGYsIGVkaXRvciwgbW9kZWws
IGluZGV4KTo8YnI+wqDCoMKgwqDCoMKgwqAgbW9kZWwuc2V0RGF0YShpbmRleCwgZWRpdG9yLnRl
eHQoKSk8YnI+PGJyPsKgwqDCoCBkZWYgdmFsaWRhdGVfdGV4dChzZWxmLCBpbmRleD1Ob25lKTo8
YnI+wqDCoMKgwqDCoMKgwqAgaWYgc2VsZi5lZGl0b3IudGV4dCgpIGluIHNlbGYudmFsaWRfaXRl
bV90ZXh0czo8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAjIHZhbGlkIGlucHV0PGJyPsKgwqDC
oMKgwqDCoMKgwqDCoMKgwqAgc2VsZi5jb21taXREYXRhLmVtaXQoc2VsZi5lZGl0b3IpPGJyPsKg
wqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VsZi5jbG9zZUVkaXRvci5lbWl0KHNlbGYuZWRpdG9yKTxi
cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNlbGYuaXNfdmFsaWQuZW1pdCgpPGJyPsKgwqDCoMKg
wqDCoMKgIGVsc2U6PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyBpbnZhbGlkIGlucHV0PGJy
PsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VsZi5jbG9zZUVkaXRvci5lbWl0KHNlbGYuZWRpdG9y
KTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNlbGYuaXNfbm90X3ZhbGlkLmVtaXQoaW5kZXgp
PGJyPjxicj5jbGFzcyBBZGRyZXNzZWVMaXN0VmlldyhRdFdpZGdldHMuUUxpc3RWaWV3KTo8YnI+
wqDCoMKgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2Vycz1bXSwgZ3JvdXBzPVtdLCBwYXJlbnQ9Tm9u
ZSk6PGJyPsKgwqDCoMKgwqDCoMKgICcnJ1NpbXBsZSBhZGRyZXNzZWUgd2lkZ2V0LicnJzxicj7C
oMKgwqDCoMKgwqDCoCBzdXBlcihBZGRyZXNzZWVMaXN0Vmlldywgc2VsZikuX19pbml0X18ocGFy
ZW50KTxicj7CoMKgwqDCoMKgwqDCoCBzZWxmLnNldEVkaXRUcmlnZ2VycyhRdFdpZGdldHMuUUFi
c3RyYWN0SXRlbVZpZXcuTm9FZGl0VHJpZ2dlcnMpPGJyPsKgwqDCoMKgwqDCoMKgIHNlbGYuc2V0
RmxvdyhRdFdpZGdldHMuUUxpc3RWaWV3LkxlZnRUb1JpZ2h0KTxicj7CoMKgwqDCoMKgwqDCoCBz
ZWxmLnNldFJlc2l6ZU1vZGUoUXRXaWRnZXRzLlFMaXN0Vmlldy5SZXNpemVNb2RlLkFkanVzdCk8
YnI+wqDCoMKgwqDCoMKgwqAgc2VsZi5zZXRTcGFjaW5nKDEwKTxicj7CoMKgwqDCoMKgwqDCoCBz
ZWxmLnNldFZpZXdNb2RlKFF0V2lkZ2V0cy5RTGlzdFZpZXcuSWNvbk1vZGUpPGJyPsKgwqDCoMKg
wqDCoMKgICNzZWxmLnNldFdyYXBwaW5nKFRydWUpPGJyPjxicj7CoMKgwqDCoMKgwqDCoCAjIGRl
bGVnYXRlPGJyPsKgwqDCoMKgwqDCoMKgIGRlbGVnYXRlID0gQWRkcmVzc2VlRGVsZWdhdGUodXNl
cnMsIGdyb3Vwcyk8YnI+wqDCoMKgwqDCoMKgwqAgc2VsZi5zZXRJdGVtRGVsZWdhdGUoZGVsZWdh
dGUpPGJyPsKgwqDCoMKgwqDCoMKgIGRlbGVnYXRlLmlzX25vdF92YWxpZC5jb25uZWN0KHNlbGYu
ZGVsZXRlX2ludmFsaWRfaW5kZXgpPGJyPjxicj7CoMKgwqDCoMKgwqDCoCAjIG1vZGVsPGJyPsKg
wqDCoMKgwqDCoMKgIG1vZGVsID0gUXRHdWkuUVN0YW5kYXJkSXRlbU1vZGVsKCk8YnI+wqDCoMKg
wqDCoMKgwqAgI21vZGVsID0gTW9kZWwoKTxicj7CoMKgwqDCoMKgwqDCoCBzZWxmLnNldE1vZGVs
KG1vZGVsKTxicj48YnI+wqDCoMKgIGRlZiBldmVudChzZWxmLCBldmVudCk6PGJyPsKgwqDCoMKg
wqDCoMKgIGlmIGV2ZW50LnR5cGUoKSA9PSBRdENvcmUuUUV2ZW50LlNob3J0Y3V0T3ZlcnJpZGU6
PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIyBuZWVkIHRvIGVtaXQgYcKgIEtleV9FbnRlciBl
dmVudCBoZXJlPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXZlbnQuYWNjZXB0KCk8YnI+wqDC
oMKgwqDCoMKgwqAgcmV0dXJuIHN1cGVyKEFkZHJlc3NlZUxpc3RWaWV3LCBzZWxmKS5ldmVudChl
dmVudCk8YnI+PGJyPsKgwqDCoCBkZWYgbW91c2VQcmVzc0V2ZW50KHNlbGYsIGV2ZW50KTo8YnI+
wqDCoMKgwqDCoMKgwqAgc2VsZi5hZGRfYW5kX2VkaXQoKTxicj48YnI+wqDCoMKgIGRlZiBhZGRf
YW5kX2VkaXQoc2VsZik6PGJyPsKgwqDCoMKgwqDCoMKgICcnJ0FkZCBhIG5ldyByb3cgYW5kIG9w
ZW4gZWRpdG9yJycnPGJyPsKgwqDCoMKgwqDCoMKgIHByaW50ICdhZGRpbmcgcm93Jzxicj7CoMKg
wqDCoMKgwqDCoCBuZXdfaXRlbSA9IFF0R3VpLlFTdGFuZGFyZEl0ZW0oJycpPGJyPsKgwqDCoMKg
wqDCoMKgIHNlbGYubW9kZWwoKS5hcHBlbmRSb3cobmV3X2l0ZW0pPGJyPsKgwqDCoMKgwqDCoMKg
IHNlbGYuZWRpdChzZWxmLm1vZGVsKCkuaW5kZXhGcm9tSXRlbShuZXdfaXRlbSkpPGJyPjxicj7C
oMKgwqAgZGVmIGRlbGV0ZV9pbnZhbGlkX2luZGV4KHNlbGYsIGluZGV4KTo8YnI+wqDCoMKgwqDC
oMKgwqAgJycnUmVtb3ZlIGludmFsaWQgZW50cnknJyc8YnI+wqDCoMKgwqDCoMKgwqAgc2VsZi5t
b2RlbCgpLnJlbW92ZVJvdyhpbmRleC5yb3coKSk8YnI+PGJyPmlmIF9fbmFtZV9fID09ICdfX21h
aW5fXyc6PGJyPsKgwqDCoCBhcHAgPSBRdFdpZGdldHMuUUFwcGxpY2F0aW9uKHN5cy5hcmd2KTxi
cj7CoMKgwqAgdXNlcnMgPSBbeyduYW1lJzonYWEnfSwgeyduYW1lJzonYmInfV08YnI+wqDCoMKg
IGdyb3VwcyA9IFt7J2NvZGUnOidjYyd9LCB7J2NvZGUnOidkZCd9XTxicj7CoMKgwqAgdyA9IEFk
ZHJlc3NlZUxpc3RWaWV3KHVzZXJzLCBncm91cHMpPGJyPsKgwqDCoCB3LnNob3coKTxicj7CoMKg
wqAgdy5yYWlzZV8oKTxicj7CoMKgwqAgYXBwLmV4ZWNfKCk8YnI+PGJyPmBgYDxicj48YnI+PGJy
Pjxicj4="
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
<div class="moz-signature markdown-here-signature">-- <br>
<p> </p>
<!-- A { text-decoration:none } -->
<table style="width: 524px; height: 58px;" border="0">
<tbody>
<tr>
<td style="text-align: right;"><a
href="http://www.ohufx.com"><img
src="http://ohufx.com/images/ohufxLogo_50x50.png"
alt="ohufxLogo 50x50"></a> </td>
<td style="text-align: center;"> <br>
</td>
<td style="text-align: left;"><strong><span
style="font-size: 8pt;"><a
href="http://ohufx.com/compositing.html">vfx
compositing</a></span> | <span style="font-size:
8pt;"><strong><a
href="http://ohufx.com/customising.html">workflow
customisation and consulting</a></strong> </span>
</strong> </td>
</tr>
<tr>
<td style="text-align: right;"> </td>
<td style="text-align: center;"> </td>
<td style="text-align: left;"><strong><span
style="font-size: 8pt;"><a
href="http://ohufx.com/compositing.html"> </a></span></strong>
<br>
</td>
</tr>
<tr>
<td style="text-align: right;"><a
href="http://www.nukepedia.com/nubridge"><img
src="http://nukepedia.com/images/nuBridge/logo/nuBridge_logo.png"
alt=""> </a> </td>
<td style="text-align: center;"> <br>
</td>
<td style="text-align: center;">
<p style="text-align: left;"><a style="color: #999;
font-size: 10px; font-family: Arial, Helvetica,
sans-serif;" href="http://www.nukepedia.com/nubridge">Your
gateway to over 1,000 free tools... right inside of
Nuke</a>
<style><!--A{text-decoration:none}--></style> </p>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>