class SearchEdit(QLineEdit): ''' SearchEdit Styled search edit box which includes a search icon, clear button, and pre-defined preview text. ''' def __init__(self, parent=None): super(SearchEdit, self).__init__(parent) clr_pixmap = QPixmap(':/icons/clear.png') self._btn_clear = QToolButton(self) self._btn_clear.setIcon(clr_pixmap) self._btn_clear.setIconSize(clr_pixmap.size()) self._btn_clear.setCursor(Qt.ArrowCursor) self._btn_clear.setStyleSheet('QToolButton { border: none; padding: 0px; }'); self._btn_clear.clicked.connect(self.clear) fw = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) #TODO: Make a Search glyph show up properly self.setStyleSheet('QLineEdit { padding-right: %dpx; }' % (self._btn_clear.sizeHint().width() + fw + 1)) msz = self.minimumSizeHint() self.setMinimumSize(max([msz.width(), self._btn_clear.sizeHint().height() + fw * 2 + 2]), max([msz.height(), self._btn_clear.sizeHint().height() + fw * 2 + 2])) self.setPlaceholderText('Search') def resizeEvent(self, e): sz = self._btn_clear.sizeHint() fw = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) self._btn_clear.move(self.rect().right() - fw - sz.width(), (self.rect().bottom() + 1 - sz.height()) / 2 + 1) def sizeHint(self): s = super(SearchEdit, self).sizeHint() s.setWidth(250) return s