gpt4 book ai didi

c++ - 当光标不在小部件上时,Qt 小部件检测鼠标事件

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:40 24 4
gpt4 key购买 nike

我用两个类创建了一个非常小的 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()
{
}

很简单。在主窗口中只能找到一个小部件。当按下鼠标按钮时,此小部件会创建一个消息框。消息框出现后,如果我用鼠标左键单击“确定”按钮,则一切正常,但如果我按“空格键”或“Enter”激活按钮,程序就会变得疯狂:如果我单击在任何地方(无论是否在小部件区域),绿色小部件就像我点击它一样弹出消息框。

这是为什么呢?我可以做些什么来抑制这种行为?

最佳答案

通过 mousePressEvent 的当前实现,您正在接受鼠标事件并且您的小部件成为鼠标抓取器。但是,突然之间,您创建了一个窃取焦点的新窗口,并且您的小部件没有收到鼠标释放事件,因此它不会释放鼠标抓取。

当您单击消息框时,它会接管鼠标抓取,一切都会按预期进行。在其他情况下,您的小部件会重新获得焦点,并且您的小部件仍会捕获鼠标。

我会说这是 Qt 错误(在窗口焦点更改时小部件应释放鼠标),只有在与您的错误代码结合使用时才会出现。

有两种解决方法:

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

关于c++ - 当光标不在小部件上时,Qt 小部件检测鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com