我创建了一个带有两个类的QT项目。其中之一是具有这些方法的重新成熟小部件:
#include "mywidget.h"
// Qt
#include <QMouseEvent>
#include <QMessageBox>
// Debug
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
}
void MyWidget::mousePressEvent(QMouseEvent *event)
{
QMessageBox::information(this, "", "");
}
另一个是具有以下方法的主要类:
#include "mainwindow.h"
// My headers
#include "mywidget.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setCentralWidget(new QWidget());
QWidget *mw = new MyWidget(this->centralWidget());
// setting backgrounds for visibility
mw->setPalette( QPalette(Qt::green) );
mw->setAutoFillBackground(true);
mw->move(20, 20);
mw->resize(50, 50);
}
MainWindow::~MainWindow()
{
}
非常简单。在主窗口中,只能找到一个小部件。按下鼠标按钮时,该小部件将创建一个消息框。出现消息框后,如果我单击"确定"按钮上的左鼠标按钮,则一切正常,但是如果我按" Space Bar"或" Enter",以激活按钮,则该程序会发疯:如果我单击在任何地方(是否在小部件区域),绿色小部件的作用就像我单击它,消息框弹出。
为什么?我该怎么做才能抑制这种行为?
在当前实现mousePressEvent
时,您正在接受鼠标事件,而小部件将成为鼠标抓手。但是,突然间,您正在板条新窗口,该窗口会窃取焦点,而小部件不会收到鼠标发布事件,因此它不会释放鼠标。
单击消息框时,它接管了鼠标抓取,一切都按应有的作用。在其他情况下,您的小部件恢复了重点,并且小部件仍然可以抓住鼠标。
我会说这是QT错误(在窗口上更改窗口小部件应释放鼠标),只有在与您的错误代码结合在一起时才会出现。
有两种解决方案:
- 不接受鼠标按下事件,在
mousePressEvent
中添加event->ignore();
- 将消息框创建到
mouseReleaseEvent
。也需要一个空的mousePressEvent
实现。