当光标不在窗口小部件上时,QT小部件检测鼠标事件



我创建了一个带有两个类的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错误(在窗口上更改窗口小部件应释放鼠标),只有在与您的错误代码结合在一起时才会出现。

有两种解决方案:

  1. 不接受鼠标按下事件,在mousePressEvent中添加event->ignore();
  2. 将消息框创建到mouseReleaseEvent。也需要一个空的mousePressEvent实现。

相关内容

  • 没有找到相关文章

最新更新