2016-07-12 7 views
0

Я создаю приложение, которое должно работать на настольных и некоторых мобильных платформах.Перетаскивание радио кнопки выполняет действие, но не устанавливает проверку

В следующем примере создаются и соединяются мои портретные/альбомные кнопки в группе с слотом на сигнале деблокирования.

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 я проверить аргумент и установить проверяемое значение, сам ... Хотя я действительно ожидал, что кнопки, чтобы знать, чтобы сделать это самостоятельно.

Но я думаю, что пользователи ожидают, что если нажать кнопку и передумать, чтобы утащить от кнопки и не выполнить действие.

ответ

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 
} 
0

Я использую QRadioButton и обрабатываю кнопку мыши, чтобы освободить событие для реагирования на переключателе переключателя. Это вызывает проблемы вообще с перетаскиванием события. Я хотел бы либо нажать кнопку , либо выполнить действие, которое не должно выполняться.

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

Всякий раз, когда кнопка включается или выключается, он испускает переключены() сигнал. Подключитесь к этому сигналу, если вы хотите активировать действие каждые , когда кнопка изменит состояние. Используйте isChecked(), чтобы узнать, выбрана ли определенная кнопка .

Либо вы подключите переключатель к проводнику в явном виде или целой группы: http://doc.qt.io/qt-5/qbuttongroup.html#buttonToggled

аннулируются QButtonGroup :: buttonToggled (* кнопка QAbstractButton, BOOL проверяемого)

Этот сигнал излучается когда данная кнопка переключается. checked - true, если кнопка отмечена, или false, если кнопка не установлена.

Примечание: Сигнальная кнопкаToggled перегружена в этом классе. Для подключения к это одно, используя синтаксис указателя на функцию, необходимо указать тип сигнала в статическом гипсе, как показано в следующем примере:

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

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

Я избегаю сигнала с переключением(), поскольку кнопки могут быть установлены через код. – Thalia

+0

Я добавил пример группы кнопок. Вы должны каким-то образом распознать отдельную кнопку. Возможно использование метода text(). – AlexanderVX

+0

Спасибо - я только что понял, я могу сравнить значение, отправленное группой с помощью кнопки, и посмотреть, действительно ли она проверена. Если нет, я отброшу действие. Он становится уродливым с группой кнопок с множеством кнопок ... – Thalia

 Смежные вопросы

  • Нет связанных вопросов^_^