Если вы можете, проще всего использовать QToolButton вместо:
QToolButton* button = new QToolButton(this);
button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
button->setIcon(myIcon);
button->setText("Sample text");
Если это не вариант, вы можете рассмотреть возможность создания собственноговиджет кнопки, возможно полученный из QPushButton или QAbstractButton.В этом случае вы, вероятно, (я сам не пробовал) захотите сосредоточить большую часть ваших усилий на повторной реализации paintEvent()
.
[Редактировать: прочитать комментарии об альтернативах, которые, вероятно, намного проще, чем эта]