If you're willing to do a little work, you can make DrawnButtons do what you
want, more-or-less. One of my colleagues here at GE CRD has done just that
in our internal LYMB system.

We have a matrix transform class that makes it easy to compute a series of
dial positions from a single set of vectors. Each set of vectors is then
drawn into a pixmap. Clicking the button advances the knob's state and
changes to the next pixmap in the sequence.

Using DrawnButtons obviously still constrains you to taking up a rectangular
portion of the parent widget, but that's normally not a big shortcoming. You
can make things look circular enough.
