覆盖mousePressEvent和mouseReleaseEvent时,clicked不起作用

时间:2019-05-08 06:17:25

标签: qt

所以我想为按钮添加一些样式。因此,我创建了一个从QPushButton派生的类。我已经重写了mousePressEvent和mouseReleaseEvent函数。到目前为止,一切都很好。一切正常,按下和释放时按钮会更改颜色。 问题来了,当我在MainWindow中尝试实现on_button_clicked()时。只是行不通。

我对事件->接受和事件->忽略做了一些实验。那没用。

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;");
}

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

1 个答案:

答案 0 :(得分:1)

当您重写方法时,您正在修改类的行为,在这种情况下,clicked信号在mouseReleaseEvent中发出,但是只有当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);
}

另一方面,由于Qt样式表支持pseudo-states,因此我看不到需要重写mousePressEvent方法:

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