John Posner <jjpos...@optimum.net> wrote: > On 7/16/2012 12:28 PM, tinn...@isbd.co.uk wrote: > > tinn...@isbd.co.uk wrote: > >> I am trying to use the PyQt4 calendar widget to perform some different > >> actions on specific dates. There are three events available:- > >> > >> selectionChanged() > >> activated(QDate) > >> clicked(QDate) > >> > >> On trying all these out it would appear that the event handlers get > >> called as follows:- > >> > >> The clicked(QDate) event gets called if you click on an already > >> selected date. > >> > >> The selectionChanged() and then the clicked(QDate) events are > >> called when you click on a new date. > >> > >> The selectionChanged(), then the clicked(QDate) and then the > >> activated(QDate) events are called if you double-click on a new date. > >> > >> The clicked(QDate) and then the activated(QDate) events are called > >> if you double-click on an already selected date. > >> > >> > >> How can I get a single-click on a date to get 'Action1' and double-click > >> on a date to get 'Action2'? > > I'm sorry, this got sent a bit before I'd completed it. The trouble > > is that I want to run Action1 if I single-click on a date whether or > > not it's a changed date and I want to run Action2 if I double-click on > > a date whether or not it's a changed date. However I don't see how I > > can do this because of the order in which the event handlers are > > called. > > > > Is there any way to manipulate this so I can get the result I want? > > At the moment the only way I can see to do it is to wait a while after > > a click and then look at what actions occurred but this seems a real > > bodge. > > I suspect that the consensus would be "don't do that" -- having > single-click and double click perform unrelated actions.
They're not actually unrelated, one will edit an existing entry in a file for the given date, the other will add a new entry in the file for that date. I.e. single-click means open file at specified date, double-click means open file at specified date and insert a new entry for that date. > But here's an > implementation based on the advice at > http://www.qtcentre.org/threads/7858-Double-Click-Capturing > > (use Ctrl-Break to break out of the event loop) > > import PyQt4.QtCore as C > import PyQt4.QtGui as G > > class Button(G.QPushButton): > def __init__(self, text): > G.QPushButton.__init__(self, text) > > # flag to suppress second mouseReleaseEvent > # in this double-click event sequence: > # 1. mousePressEvent > # 2. mouseReleaseEvent > # 3. mouseDoubleClickEvent > # 4. mouseReleaseEvent > self.double_clicked = False > > def mouseReleaseEvent(self, evt): > # executed for first mouseReleaseEvent > if not self.double_clicked: > self.first_click_timer = C.QTimer() > self.first_click_timer.setSingleShot(True) > # double-click must occur within 1/4 second of first-click > release > self.first_click_timer.setInterval(250) > self.first_click_timer.timeout.connect(self.single_click_action) > self.first_click_timer.start() > # executed for second mouseReleaseEvent > else: > # reset the flag > self.double_clicked = False > > def single_click_action(self): > print "Performing single-click action" > > def mouseDoubleClickEvent(self, evt): > # suppress the single-click action; perform double-click action > instead > self.first_click_timer.stop() > print "Performing double-click action" > > # prepare for second mouseReleaseEvent > self.double_clicked = True > > # main program > > app = G.QApplication([]) > button = Button("Click or double-click me") > button.show() > app.exec_() > > Yes, thanks, though it is basically the bodge using timing that I was trying to avoid. It's so fundamental to most GUIs that single-click and double-click allow one to do different things with the same object I'm surprised that pyqt makes it so difficult to implement. -- Chris Green -- http://mail.python.org/mailman/listinfo/python-list