我正在创建一个应该适用于桌面和某些移动平台的应用程序。
以下示例创建并将组中的纵向/横向按钮连接到释放信号上的插槽。
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
我测试参数并自己设置检查值...虽然我真的希望按钮知道自己这样做。
但我认为用户更期望,如果按下按钮并改变主意,就可以拖离按钮而不执行操作。
答案 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!
}
}
/* ... */ });