Question is, what for you need it to be a button?

Simple row delegate will solve all your issues with painting and combined with cellActivated() signal it will act as button.
What else do you need?