qt - 当 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;");
}
我希望我的按钮在按下和释放时具有两种样式以及功能。我可以编写一个观察者类来解决这个问题,但我觉得必须有一个更简单的解决方案。
解决方案
当您重写一个方法时,您正在修改类的行为,在这种情况下,在 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;
}
)");
推荐阅读
- typescript - 如何在 Cypress 中将默认的无头浏览器更改为 chrome
- templates - 在不同节点的级别上应用模板
- phpstorm - PhpStorm 2021.1 抛出“运行‘ABCD’时出错。未检测到调试器扩展”
- android - 如何设计这样的布局?我应该使用 recyclerview、viewpager 还是其他东西?
- sorting - 如何批量使用排序命令并按/+9排序
- r - 如何将对数回归拟合到 R 中的“负指数”散点图
- c# - 如何从主视图模型中动态地用一个用户控件填充选项卡控件的项目列表的每个选项卡
- r - 总结列并在 R 中添加它的常用值
- fragment - 多个纹理 webgl frag 着色器问题
- c++ - 将包含 11111111 的地址读取为无符号整数显示 4294967295