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 或类似的。