You can simplify Kuba's clever approach a bit by combining the set operation of the Dynamic (triggered by the Automatic) with the logic table you want (I think it makes the code a bit easier to read).
{RadioButton[Dynamic[pp, ({pp, qq, rr} = {#, False, False}) &], True],
RadioButton[Dynamic[qq, ({pp, qq, rr} = {False, #, False}) &], True],
RadioButton[Dynamic[rr, ({pp, qq, rr} = {False, False, #}) &], True],
Dynamic[pp], Dynamic[qq], Dynamic[rr]}
Alternatively (again building on Kuba's post) you can keep the radio button variable separate (which may be even easier to read and see what is going on but involves more code)
{RadioButton[Dynamic[x,({x,pp,qq,rr}={#,True,False,False})&],1],
RadioButton[Dynamic[x,({x,pp,qq,rr}={#,False,True,False})&],2],
RadioButton[Dynamic[x,({x,pp,qq,rr}={#,False,False,True})&],3],
Dynamic[pp],Dynamic[qq],Dynamic[rr], Dynamic[x]}
Also you can do something similar with a checkbox since you are now manually controlling the behavior anyway (so there is no need to rely on RadioButton)
{Checkbox[Dynamic[pp, ({pp, qq, rr} = {#, False, False}) &]],
Checkbox[Dynamic[qq, ({pp, qq, rr} = {False, #, False}) &]],
Checkbox[Dynamic[rr, ({pp, qq, rr} = {False, False, #}) &]],
Dynamic[pp], Dynamic[qq], Dynamic[rr]}
Hope this helps.
Regards