PyQt QCalendarWidget events question

John Posner jjposner at optimum.net
Mon Jul 16 21:58:05 CEST 2012


On 7/16/2012 12:28 PM, tinnews at isbd.co.uk wrote:
> tinnews at 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. 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_()


HTH,
John




More information about the Python-list mailing list