所以我想为按钮添加一些样式。因此,我创建了一个从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;");
}
我希望按钮在按下和释放时都具有样式和功能。我可以编写一个观察者类并解决此问题,但我觉得必须有一个更简单的解决方案。
答案 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;
}
)");