Qt中的开关按钮夫妇
Switch button couple in Qt
我正在用两个 QPushButton
构建一个简单的开关。一开始,只有一个被启用(假设按钮 1),当您单击它时,它被禁用,而按钮 2 被启用。如果您单击按钮 2,它会被禁用,而按钮 1 会被启用。
这是 .cpp 代码:
#include "SwitchButton.h"
#include "ui_SwitchButton.h"
SwitchButton::SwitchButton(QWidget * parent,
bool initialStatus,
const QString & trueText,
const QString & falseText)
: QWidget(parent), ui(new Ui::SwitchButton)
{
ui->setupUi(this);
ui->trueButton->setText(trueText);
ui->falseButton->setText(falseText);
// NOTE: Redundant, emits the corresponding signal while constructed
if (initialStatus)
on_trueButton_clicked();
else
on_falseButton_clicked();
}
SwitchButton::~SwitchButton()
{
delete ui;
}
void SwitchButton::on_trueButton_clicked()
{
ui->trueButton->setEnabled(false);
ui->falseButton->setEnabled(true);
emit changeStatus(true);
}
void SwitchButton::on_falseButton_clicked()
{
ui->falseButton->setEnabled(false);
ui->trueButton->setEnabled(true);
emit changeStatus(false);
}
看起来很简单,并且在一定程度上可行。虽然按钮保持一致的 enabled/disabled 状态,但有时当我切换得非常快时,禁用按钮的背景颜色不会变暗。这是一个例子:
简单地用 Tab 键让背景颜色自行修复,但我想知道我是否忽略了什么,有办法避免这种行为。
编辑:我做了更多测试,发现它与配对按钮无关,但如果双击速度足够快,即使是单个按钮也会发生(可能我在做类似的事情时没有注意到)。
我能够重现该行为:单击按钮,同时鼠标悬停在按钮上有时会导致悬停附带的动画未正确完成。
在禁用按钮被禁用一段时间后更新禁用按钮会清除错误的动画。在禁用“pushButton”的函数中添加以下行清除了错误的动画:
std::thread([&]{ std::this_thread::sleep_for(std::chrono::milliseconds(500)); pushButton->update();}).detach();
在调用 setEnabled(false);
后立即更新禁用的按钮并不能阻止这种行为,但我无法找到有关如何在 qt 源代码中实现鼠标悬停动画的任何信息。
作为解决方法,您可以在一段时间后对按钮进行适当的延迟更新,例如通过 QTimer 或类似的。
我正在用两个 QPushButton
构建一个简单的开关。一开始,只有一个被启用(假设按钮 1),当您单击它时,它被禁用,而按钮 2 被启用。如果您单击按钮 2,它会被禁用,而按钮 1 会被启用。
这是 .cpp 代码:
#include "SwitchButton.h"
#include "ui_SwitchButton.h"
SwitchButton::SwitchButton(QWidget * parent,
bool initialStatus,
const QString & trueText,
const QString & falseText)
: QWidget(parent), ui(new Ui::SwitchButton)
{
ui->setupUi(this);
ui->trueButton->setText(trueText);
ui->falseButton->setText(falseText);
// NOTE: Redundant, emits the corresponding signal while constructed
if (initialStatus)
on_trueButton_clicked();
else
on_falseButton_clicked();
}
SwitchButton::~SwitchButton()
{
delete ui;
}
void SwitchButton::on_trueButton_clicked()
{
ui->trueButton->setEnabled(false);
ui->falseButton->setEnabled(true);
emit changeStatus(true);
}
void SwitchButton::on_falseButton_clicked()
{
ui->falseButton->setEnabled(false);
ui->trueButton->setEnabled(true);
emit changeStatus(false);
}
看起来很简单,并且在一定程度上可行。虽然按钮保持一致的 enabled/disabled 状态,但有时当我切换得非常快时,禁用按钮的背景颜色不会变暗。这是一个例子:
简单地用 Tab 键让背景颜色自行修复,但我想知道我是否忽略了什么,有办法避免这种行为。
编辑:我做了更多测试,发现它与配对按钮无关,但如果双击速度足够快,即使是单个按钮也会发生(可能我在做类似的事情时没有注意到)。
我能够重现该行为:单击按钮,同时鼠标悬停在按钮上有时会导致悬停附带的动画未正确完成。
在禁用按钮被禁用一段时间后更新禁用按钮会清除错误的动画。在禁用“pushButton”的函数中添加以下行清除了错误的动画:
std::thread([&]{ std::this_thread::sleep_for(std::chrono::milliseconds(500)); pushButton->update();}).detach();
在调用 setEnabled(false);
后立即更新禁用的按钮并不能阻止这种行为,但我无法找到有关如何在 qt 源代码中实现鼠标悬停动画的任何信息。
作为解决方法,您可以在一段时间后对按钮进行适当的延迟更新,例如通过 QTimer 或类似的。