pyqt4qt4pysideqlineeditqtoolbutton

How to insert a button inside a QLineEdit


I need help inserting a button inside in a QLineEdit that can call a function.

For example, like this google image:

Button in line edit


Solution

  • Below is a nearly direct translation of the Qt code from here.

    Differences:

    Code:

    from PyQt4 import QtGui, QtCore
    
    class ButtonLineEdit(QtGui.QLineEdit):
        buttonClicked = QtCore.pyqtSignal(bool)
    
        def __init__(self, icon_file, parent=None):
            super(ButtonLineEdit, self).__init__(parent)
    
            self.button = QtGui.QToolButton(self)
            self.button.setIcon(QtGui.QIcon(icon_file))
            self.button.setStyleSheet('border: 0px; padding: 0px;')
            self.button.setCursor(QtCore.Qt.ArrowCursor)
            self.button.clicked.connect(self.buttonClicked.emit)
    
            frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
            buttonSize = self.button.sizeHint()
    
            self.setStyleSheet('QLineEdit {padding-right: %dpx; }' % (buttonSize.width() + frameWidth + 1))
            self.setMinimumSize(max(self.minimumSizeHint().width(), buttonSize.width() + frameWidth*2 + 2),
                                max(self.minimumSizeHint().height(), buttonSize.height() + frameWidth*2 + 2))
    
        def resizeEvent(self, event):
            buttonSize = self.button.sizeHint()
            frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
            self.button.move(self.rect().right() - frameWidth - buttonSize.width(),
                             (self.rect().bottom() - buttonSize.height() + 1)/2)
            super(ButtonLineEdit, self).resizeEvent(event)
    

    Usage:

    import sys
    from PyQt4 import QtGui
    
    def buttonClicked():
        print 'You clicked the button!'
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
    
        main = ButtonLineEdit('/path/to/my_fancy_icon.png')
        main.buttonClicked.connect(buttonClicked)
        main.show()
    
        sys.exit(app.exec_())