我需要创建一个具有三种状态的按钮:
- 未点击
- 中间的
- 点击
我想用这个按钮实现的逻辑是,每当点击这个按钮时,我希望系统进入中间状态并等待一个事件。
换句话说,当状态转换时unclicked --> intermediate -- > clicked
,然后clicked --> intermediate -->unclicked
。
Qt 支持实现这种按钮吗?如果是这样,怎么做?
我需要创建一个具有三种状态的按钮:
我想用这个按钮实现的逻辑是,每当点击这个按钮时,我希望系统进入中间状态并等待一个事件。
换句话说,当状态转换时unclicked --> intermediate -- > clicked
,然后clicked --> intermediate -->unclicked
。
Qt 支持实现这种按钮吗?如果是这样,怎么做?
您拥有的最近的是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);
});
其他更详细的选项是使用 aQProxyStyle
或重新实现QPushButton
类本身。