首页 > 解决方案 > 当 mousePressEvent 和 mouseReleaseEvent 被覆盖时,clicked 不起作用

问题描述

所以我想为我的按钮添加一些样式。所以我创建了一个派生自 QPushButton 的类。我已经覆盖了 mousePressEvent 和 mouseReleaseEvent 函数。到现在为止还挺好。一切都按预期工作,按钮在按下和释放时会改变颜色。问题出现在我的 MainWindow 中,我尝试实现 on_button_clicked()。它只是行不通。

我用 event->accept 和 event->ignore 做了一些试验。那没有用。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

void MainWindow::on_characters_clicked()
{
    qDebug("Hello");
}

void Button::mousePressEvent(QMouseEvent* event)
{
    setStyleSheet(defaultStyle + "Background-color: gray;");
}

void Button::mouseReleaseEvent(QMouseEvent* event) {
    setStyleSheet(defaultStyle + "Background-color: darkgray; border: 1px solid gray; color: white;");
}

我希望我的按钮在按下和释放时具有两种样式以及功能。我可以编写一个观察者类来解决这个问题,但我觉得必须有一个更简单的解决方案。

标签: qt

解决方案


当您重写一个方法时,您正在修改类的行为,在这种情况下,在 mouseReleaseEvent 中发出 clicked 信号,但只有在 mousePressEvent 接受事件时才会调用 mouseReleaseEvent,但在修改代码时您已经消除了它。解决方案是调用父级的实现。

void Button::mousePressEvent(QMouseEvent* event)
{
    setStyleSheet(defaultStyle + "Background-color: gray;");
    QPushButton::mousePressEvent(event);
}

void Button::mouseReleaseEvent(QMouseEvent* event) {
    setStyleSheet(defaultStyle + "Background-color: darkgray; border: 1px solid gray; color: white;");
    QPushButton::mouseReleaseEvent(event);
}

另一方面,我认为没有必要重写 mousePressEvent 方法,因为 Qt 样式表支持伪状态

setStyleSheet(R"(
    Button{
      // default styles
      background-color: darkgray; 
      border: 1px solid gray; 
      color: white;
    }
    Button::presed{
      // default styles
      background-color: gray;
    }
)");

推荐阅读