PyQt QCalendarWidget events question

Discussion in 'Python' started by tinnews@isbd.co.uk, Jul 16, 2012.

  1. Guest

    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'?

    --
    Chris Green
     
    , Jul 16, 2012
    #1
    1. Advertising

  2. Guest

    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.

    --
    Chris Green
     
    , Jul 16, 2012
    #2
    1. Advertising

  3. John Posner Guest

    Re: Re: PyQt QCalendarWidget events question

    On 7/16/2012 12:28 PM, wrote:
    > 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
     
    John Posner, Jul 16, 2012
    #3
  4. Guest

    John Posner <> wrote:
    > On 7/16/2012 12:28 PM, wrote:
    > > 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
     
    , Jul 17, 2012
    #4
  5. On Tue, Jul 17, 2012 at 7:34 PM, <> wrote:
    > It's so fundamental to most GUIs that single-click
    > and double-click allow one to do different things with the same object


    Kinda yes, kinda no. Most GUIs and GUI recommendations would either
    enforce or strongly suggest that the double-click action incorporate
    the click action; for instance, click to select, double-click to open.

    The series of events usually goes:

    Mouse down
    Mouse up
    Click
    Mouse down
    Mouse up
    Double-click

    They're fired as things happen and in that order. (Some systems insert
    another Click just before the Double-click, but that's generally
    unhelpful.) Please code your application so that this isn't a problem
    to it, because anything else causes untold confusion to the users.

    ChrisA
     
    Chris Angelico, Jul 17, 2012
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. shiv
    Replies:
    0
    Views:
    516
  2. ulysses
    Replies:
    4
    Views:
    820
    Werner Schiendl
    Oct 22, 2003
  3. Alexander Tuchacek
    Replies:
    1
    Views:
    1,039
    Bjoern Schliessmann
    Nov 25, 2007
  4. David Boddie
    Replies:
    1
    Views:
    1,129
    Alexander Tuchacek
    Nov 25, 2007
  5. Chris

    Events Events Events Please Help

    Chris, Aug 30, 2005, in forum: ASP .Net Web Controls
    Replies:
    0
    Views:
    423
    Chris
    Aug 30, 2005
Loading...

Share This Page