so today, I am playing golf and listening to last week's tllts.
for the 1st time in my life, I get half way through the show (well, maybe 30 minutes in)... and i think "not enjoying this!" and delete it!
imagine what a douche i feel then, when I get home.... to find an air mail package containing a tllts T-shirt and hackey sack.
it's as if the cock just crowed 3 times, and i realise my denial.
Allan, Pat, Linc and Dann, please forgive me, it won't happen again.
Random musings on GNU+Linux. open source software, and Python. The main purpose of this blog is to archive (for myself) what I am learning about these wonderful technologies/communities
Wednesday, 4 August 2010
openmolar2
last night I began work on a new version of openmolar.
this one will not be done in a hurry (ie. in 4 months because of a proprietary license termination), nor will I be bound to a schema which I dare not change. I have come a long way on my programming journey, and feel ready to take the plunge into what I hope will be the most customisable, pluggable, and downright froody piece of dental management software known to mankind.
openmolar up to this point, is software for my practice alone.
openmolar2 will be of use to other practices (I hope).
more later.
Neil.
this one will not be done in a hurry (ie. in 4 months because of a proprietary license termination), nor will I be bound to a schema which I dare not change. I have come a long way on my programming journey, and feel ready to take the plunge into what I hope will be the most customisable, pluggable, and downright froody piece of dental management software known to mankind.
openmolar up to this point, is software for my practice alone.
openmolar2 will be of use to other practices (I hope).
more later.
Neil.
Tuesday, 3 August 2010
QTextEdit with autocompletion using pyqt
Problem - I wanted a text-edit which would help enter long words.
Solution - I have converted the C++ example code into python, and post it here to for all to see.
NB - The code assumes your dictionary is located at /usr/share/dict/words.
Solution - I have converted the C++ example code into python, and post it here to for all to see.
NB - The code assumes your dictionary is located at /usr/share/dict/words.
from PyQt4 import QtGui, QtCore STARTTEXT = ('This TextEdit provides autocompletions for words that have ' + 'more than 3 characters.\nYou can trigger autocompletion using %s\n\n'''% ( QtGui.QKeySequence("Ctrl+E").toString(QtGui.QKeySequence.NativeText))) class DictionaryCompleter(QtGui.QCompleter): def __init__(self, parent=None): words = [] try: f = open("/usr/share/dict/words","r") for word in f: words.append(word.strip()) f.close() except IOError: print "dictionary not in anticipated location" QtGui.QCompleter.__init__(self, words, parent) class CompletionTextEdit(QtGui.QTextEdit): def __init__(self, parent=None): super(CompletionTextEdit, self).__init__(parent) self.setMinimumWidth(400) self.setPlainText(STARTTEXT) self.completer = None self.moveCursor(QtGui.QTextCursor.End) def setCompleter(self, completer): if self.completer: self.disconnect(self.completer, 0, self, 0) if not completer: return completer.setWidget(self) completer.setCompletionMode(QtGui.QCompleter.PopupCompletion) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer = completer self.connect(self.completer, QtCore.SIGNAL("activated(const QString&)"), self.insertCompletion) def insertCompletion(self, completion): tc = self.textCursor() extra = (completion.length() - self.completer.completionPrefix().length()) tc.movePosition(QtGui.QTextCursor.Left) tc.movePosition(QtGui.QTextCursor.EndOfWord) tc.insertText(completion.right(extra)) self.setTextCursor(tc) def textUnderCursor(self): tc = self.textCursor() tc.select(QtGui.QTextCursor.WordUnderCursor) return tc.selectedText() def focusInEvent(self, event): if self.completer: self.completer.setWidget(self); QtGui.QTextEdit.focusInEvent(self, event) def keyPressEvent(self, event): if self.completer and self.completer.popup().isVisible(): if event.key() in ( QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return, QtCore.Qt.Key_Escape, QtCore.Qt.Key_Tab, QtCore.Qt.Key_Backtab): event.ignore() return ## has ctrl-E been pressed?? isShortcut = (event.modifiers() == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_E) if (not self.completer or not isShortcut): QtGui.QTextEdit.keyPressEvent(self, event) ## ctrl or shift key on it's own?? ctrlOrShift = event.modifiers() in (QtCore.Qt.ControlModifier , QtCore.Qt.ShiftModifier) if ctrlOrShift and event.text().isEmpty(): # ctrl or shift key on it's own return eow = QtCore.QString("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-=") #end of word hasModifier = ((event.modifiers() != QtCore.Qt.NoModifier) and not ctrlOrShift) completionPrefix = self.textUnderCursor() if (not isShortcut and (hasModifier or event.text().isEmpty() or completionPrefix.length() < 3 or eow.contains(event.text().right(1)))): self.completer.popup().hide() return if (completionPrefix != self.completer.completionPrefix()): self.completer.setCompletionPrefix(completionPrefix) popup = self.completer.popup() popup.setCurrentIndex( self.completer.completionModel().index(0,0)) cr = self.cursorRect() cr.setWidth(self.completer.popup().sizeHintForColumn(0) + self.completer.popup().verticalScrollBar().sizeHint().width()) self.completer.complete(cr) ## popup it up! if __name__ == "__main__": app = QtGui.QApplication([]) completer = DictionaryCompleter() te = CompletionTextEdit() te.setCompleter(completer) te.show() app.exec_()
Subscribe to:
Posts (Atom)