Results 1 to 5 of 5

Thread: How to find which button was pressed (PyQt5)

  1. #1
    Join Date
    Jan 2020
    Qt products
    Unix/X11 Windows

    Default How to find which button was pressed (PyQt5)

    Hello fellow qt users.

    In the process of learning python I created a tictactoe game and use the PyQt5 to create a gui. Simple 3x3 grid of buttons created in a loop with a view to a 4x4 grid later. Ran into a problem, how to identify the button pressed? Code below shows ugly solution used. Putting clicked.connect statements in the loop fails as it seems the variables i and j are passed by reference so they all contain 2, 2 when the loop exits. Full code here: I've probably missed something some were in the docs.

    Qt Code:
    1. GRID_SIZE = 3
    2. # Create our board of 9 buttons and put them in a grid
    3. for i in range(0, GRID_SIZE ):
    4. for j in range(0, GRID_SIZE ):
    5. self.button[i][j] = QPushButton()
    6. self.button[i][j].setMinimumSize(25, 25)
    7. self.button[i][j].setMaximumSize(25, 25)
    8. grid.addWidget(self.button[i][j], i, j)
    10. vbox.addLayout(grid)
    11. # Add the warnings label
    12. vbox.addWidget(self.labelWarn)
    13. vbox.addStretch(0)
    14. hbox.addLayout(vbox)
    15. hbox.addStretch(0)
    16. self.setLayout(hbox)
    18. self.button[0][0].clicked.connect(lambda: self.on_button_clicked(0, 0))
    19. self.button[0][1].clicked.connect(lambda: self.on_button_clicked(0, 1))
    20. self.button[0][2].clicked.connect(lambda: self.on_button_clicked(0, 2))
    21. self.button[1][0].clicked.connect(lambda: self.on_button_clicked(1, 0))
    22. self.button[1][1].clicked.connect(lambda: self.on_button_clicked(1, 1))
    23. self.button[1][2].clicked.connect(lambda: self.on_button_clicked(1, 2))
    24. self.button[2][0].clicked.connect(lambda: self.on_button_clicked(2, 0))
    25. self.button[2][1].clicked.connect(lambda: self.on_button_clicked(2, 1))
    26. self.button[2][2].clicked.connect(lambda: self.on_button_clicked(2, 2))
    To copy to clipboard, switch view to plain text mode 

  2. #2
    Join Date
    Mar 2008
    Kraków, Poland
    Thanked 281 Times in 276 Posts
    Qt products
    Unix/X11 Windows

    Default Re: How to find which button was pressed (PyQt5)

    I don't know how in Python but in C++ it is a method QObject::sender().

  3. The following user says thank you to Lesiok for this useful post:

    RickTee (27th January 2020)

  4. #3
    Join Date
    Jan 2008
    Alameda, CA, USA
    Thanked 808 Times in 797 Posts
    Qt products
    Windows Android

    Default Re: How to find which button was pressed (PyQt5)

    self.button[0][0].clicked.connect(lambda: self.on_button_clicked(0, 0))
    And I don't know if Python allows you to do tricks that C++ cannot, but in C++, the slot that is connected to a signal must have the same signature (usually) as the signal: the clicked() signal has no arguments, so the on_clicked() slot cannot have any either. Even when the slot is a lambda, the arguments will be stripped off when the slot is called, if it compiles at all.

    The exception to the rule is a signal that -does- pass arguments can be connected to a slot defined with fewer arguments (in which case the extra arguments are simply ignored).
    <=== The Great Pumpkin says ===>
    Please use CODE tags when posting source code so it is more readable. Click "Go Advanced" and then the "#" icon to insert the tags. Paste your code between them.

  5. The following user says thank you to d_stranz for this useful post:

    RickTee (29th January 2020)

  6. #4
    Join Date
    Jul 2019
    Qt products

    Default Re: How to find which button was pressed (PyQt5)

    If you didn't find any solution, you can add all buttons to a QButtonGroup and then when a button is clicked the button group will emit buttonClicked signal which has as parameter the ID of the button or the button itself for overload version.
    But use it in the last instance when you don't find how to solve it because the button group is for checkable buttons. Better call QObject::sender() in your slot to get the button.

  7. #5
    Join Date
    Mar 2009
    Brisbane, Australia
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Unix/X11 Windows
    Wiki edits

    Default Re: How to find which button was pressed (PyQt5)

    QSignalMapper is definite option. Connect all button's clicked() to a mapper's map(). Map each button to an integer 0..(GRID_SIZE^2-1). In the slot connected to mapped(int) derive the row/column from the integer.

Similar Threads

  1. How to add a custom minimize button in PyQt5?
    By AbhaySalvi in forum Newbie
    Replies: 0
    Last Post: 2nd January 2020, 09:54
  2. Replies: 5
    Last Post: 25th January 2017, 09:47
  3. do something while a button is pressed
    By saman_artorious in forum Qt Programming
    Replies: 11
    Last Post: 12th November 2013, 15:39
  4. Replies: 6
    Last Post: 4th October 2010, 03:19
  5. Getting the row for button pressed
    By steg90 in forum Qt Programming
    Replies: 2
    Last Post: 28th November 2007, 15:45


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.