Как реализовать кнопку с тремя состояниями, используя Qt

Мне нужно создать кнопку, которая имеет три состояния:

  • unclicked
  • промежуточный
  • щелкнул

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

Другим способом, когда переход состояния unclicked --> intermediate -- > clicked а потом clicked --> intermediate -->unclicked,

Поддерживает ли Qt реализацию кнопок такого типа? Если так, то как?

1

Решение

Ближайший у вас есть QCheckBox, У него уже есть свойство: QCheckBox::setTristate:

auto yourCheckBoxButton = new QCheckBox("Tristate button");
yourCheckBoxButton->setTristate(true);

Вы можете сделать это и в Designer (он находится в конце списка свойств).

Если вы не хотите использовать QCheckBoxэто может сделать таблица стилей и настраиваемое свойство, которое изменяется при каждом нажатии кнопки:

auto pushButton = new QPushButton("Tristate button");
pushButton->setProperty("state", 0);
pushButton->setProperty("state-step", 1); // change to next state, 1 or -1
pushButton->setStyleSheet("QPushButton[state=\"0\"] { background: red; }""QPushButton[state=\"1\"] { background: grey; }""QPushButton[state=\"2\"] { background: blue; }");
connect(pushButton, &QPushButton::clicked, [ = ](bool) {
const int state = pushButton->property("state").toInt();
const int step = state == 0 ? 1 :
state == 2 ? -1 : pushButton->property("state-step").toInt();
pushButton->setProperty("state", state + step);
pushButton->setProperty("state-step", step); // update in case it changed

// Changing the property is not enough to choose a new style from the stylesheet,
//  it is necessary to force a re-evaluation
pushButton->style()->unpolish(pushButton);
pushButton->style()->polish(pushButton);
});

Другие более сложные варианты будут использовать QProxyStyle или повторно реализовать QPushButton сам класс.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]