拖动单选按钮会执行操作,但不会设置检查

时间:2016-07-12 22:35:08

标签: qt mouseevent qradiobutton

我正在创建一个应该适用于桌面和某些移动平台的应用程序。

以下示例创建并将组中的纵向/横向按钮连接到释放信号上的插槽。

m_landscapeRadio = new QRadioButton(QObject::tr("Landscape "));
m_portraitRadio = new QRadioButton(QObject::tr("Portrait "));
m_orientationGroup.addButton(m_landscapeRadio, 0);
m_orientationGroup.addButton(m_portraitRadio, 1);
m_orientationGroup.setExclusive(true);
m_landscapeRadio->setChecked(true);
connect(&m_orientationGroup, SIGNAL(buttonReleased(int)), this, SLOT(orientationSlot(int)));

但我发现了一个奇怪的情况:

假设已选中横向按钮。如果我按下并拖离纵向单选按钮,则会执行插槽操作(对于纵向选项),但不会选中纵向按钮。

我希望不要执行该操作。

现在......

orientationSlot我测试参数并自己设置检查值...虽然我真的希望按钮知道自己这样做。

但我认为用户更期望,如果按下按钮并改变主意,就可以拖离按钮而不执行操作。

2 个答案:

答案 0 :(得分:1)

我可以处理验证检查是否真的发生在操作槽中,并根据我认为用户体验更好的方式检查或放弃操作...

如果我想要检查按钮并执行操作:

void MyWidget::orientationSlot(int checked)
{
    if(checked) m_portraitRadio->setChecked(true);
    else        m_landscapeRadio->setChecked(true);

    .... actual actions
}

如果我希望在用户拖离按钮时不执行操作(我的首选选项):

void MyWidget::orientationSlot(int checked)
{
    if(m_orientationGroup.checkedId() != checked) return;

    .... actual actions
}

答案 1 :(得分:0)

  

我使用QRadioButton并处理释放事件的鼠标按钮以作出反应   在单选按钮被切换。它与拖动事件一起导致问题。我想得到按钮   待检查,或不执行的行动。

http://doc.qt.io/qt-5/qradiobutton.html

  

无论何时打开或关闭按钮,它都会发出切换()   信号。如果要逐个触发操作,请连接此信号   按钮改变状态的时间。使用isChecked()查看是否特定   按钮被选中。

将单选按钮显式连接到处理程序或整个组:http://doc.qt.io/qt-5/qbuttongroup.html#buttonToggled

  

void QButtonGroup :: buttonToggled(QAbstractButton *按钮,bool   选中)

     

切换给定按钮时会发出此信号。检查是   如果选中该按钮,则为true;如果未选中该按钮,则为false。

     

注意:此类中的信号buttonToggled已重载。连接到   这一个使用函数指针语法,必须指定   静态强制转换中的信号类型,如下例所示:

connect(buttonGroup, static_cast<void(QButtonGroup::*)
      (QAbstractButton *, bool)>(&QButtonGroup::buttonToggled),
    [=](QAbstractButton *button, bool checked) {

     if (button == m_portraitRadio) {
      // Portrait (un)checked
      if (checked)
      {
         // checked!
      }
     }
     /* ... */ });