Search code examples
pythonpyqtpyqt4qtoolbar

PyQt how to make a toolbar button appeared as pressed


I want to make a specific button in PyQt toolbar appeared as pressed(with blue background). Suppose when I hit the toolbar button I want it to be appeared as pressed

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Window(QtGui.QMainWindow):   
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 700, 700)
        self.setWindowTitle('Rich Text Editor')
        self.statusBar = QStatusBar()
        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.setStatusBar(self.statusBar)
        self.home()

    def home(self):
        changeBoldActionTB = \
        QtGui.QAction(QtGui.QIcon('bold-text-option.png'),
                      'Make the text bold', self)
        changeBoldActionTB.triggered.connect(self.changeBold)

        self.formatbar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, self.formatbar)
        self.formatbar.addAction(changeBoldActionTB)
        self.show()

    def changeBold(self):
         pass
         #I think this does't matter        

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

run()

I have two toolbars.I am planning to use cursorPositionChanged to do this but still is there a way in PyQt to do this enter image description here

reproduible code: https://files.fm/u/h4c2amdx


Solution

  • Instead of using QAction you must use QToolButton and set the checkable property to True:

    toolButton.setCheckable(True)
    

    Example:

    class Window(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
            self.setWindowTitle('Rich Text Editor')
            self.statusBar = QStatusBar(self)
            self.textEdit = QtGui.QTextEdit(self)
            self.setCentralWidget(self.textEdit)
            self.setStatusBar(self.statusBar)
    
            self.home()
    
        def home(self):
            toolButton = QToolButton(self)
            toolButton.setIcon(QtGui.QIcon('bold-text-option.png'))
            toolButton.setCheckable(True)
            toolButton.toggled.connect(self.onToggled)
    
            self.formatbar = QToolBar(self)
            self.addToolBar(Qt.TopToolBarArea, self.formatbar)
            self.formatbar.addWidget(toolButton)
    
        def onToggled(self, checked):
            print(checked)
    

    Screenshots:

    enter image description here

    enter image description here

    Plus: To set the value manually and to obtain the status the following instructions are used:

    toolButton.setChecked(True) # set State
    print(toolButton.isChecked()) # get State
    toolButton.toggle() # change state