gpt4 book ai didi

c++ - 移动/拖动无框窗口? [Qt]

转载 作者:行者123 更新时间:2023-11-30 03:44:17 38 4
gpt4 key购买 nike

我有一个非常简单的无窗口应用程序 (setWindowFlags(Qt::FramelessWindowHint);) 并且有一个 QPushButton

enter image description here

我使用以下代码使整个窗口可拖动:

void myApp::mousePressEvent(QMouseEvent* event){
m_nMouseClick_X_Coordinate = event->x();
m_nMouseClick_Y_Coordinate = event->y();
qDebug() << m_nMouseClick_X_Coordinate;
qDebug() << m_nMouseClick_Y_Coordinate;
}

void myApp::mouseMoveEvent(QMouseEvent* event){
move(event->globalX()-m_nMouseClick_X_Coordinate,event->globalY()-m_nMouseClick_Y_Coordinate);
qDebug() << event->globalX();
qDebug() << event->globalY();
}

当我拖动 QPushButton 上的 以外的任何地方时,窗口可以正常拖动。如果我开始拖动按钮(单击并按住),qDebug 不会输出任何内容。当我开始拖动时,窗口移动了,但是拖动原点跳到上一次拖动开始的坐标,光标也跳到上次拖动的位置。有没有办法让它在 QPushButton 上开始拖动不会导致这种行为?当 QPushButton 是拖动的开始时,坐标似乎没有被捕获。

提前致谢。


编辑:请参阅下面@Hi 我是 Frogatto 的回复。它很好地概述了如何实现它并让它发挥作用。我最终将事件过滤器安装到构造函数中的按钮:

ui->pushButton->installEventFilter(this);

然后我创建了我的事件过滤器:

bool myApp::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->pushButton && event->type()==QMouseEvent::MouseButtonPress){
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
// m_nMouseClick_X_Coordinate = mouseEvent->x() + 100;
// m_nMouseClick_Y_Coordinate = mouseEvent->y() + 90;
absPosX = ui->pushButton->mapToParent(QPoint(0,0)).x();
absPosY = ui->pushButton->mapToParent(QPoint(0,0)).y();
m_nMouseClick_X_Coordinate = mouseEvent->x() + absPosX;
m_nMouseClick_Y_Coordinate = mouseEvent->y() + absPosY;
return true;
}
return false;
}

请注意,我注释掉了用硬值更新两个变量的部分。我不想每次都对按钮的位置进行硬编码,所以我使用 mapToParent 定义了按钮的一些绝对位置。

最佳答案

QPushButton 似乎吸收了按下事件,但没有将其传递给其父窗口小部件。所以在这种情况下,父部件不会收到鼠标按下事件的通知。此问题的一个简单解决方案是使用 Qt event filters .您可以在该 QPushButton 上安装一个事件过滤器,它可以被视为此按钮的所有事件的入口点。

因此,工作流程如下:

  1. 用户按下鼠标点击按钮。
  2. 鼠标按下事件被传送到我们的事件过滤器。
  3. 我们的事件过滤器更新 m_nMouseClick_X_Coordinatem_nMouseClick_Y_Coordinate 变量。然后将事件重定向到按钮。
  4. 按钮接收事件...

现在,我们应该做:

  • 定义我们的事件过滤器类。
  • 并实现其过滤器方法。

我会把剩下的留给你作为练习。 :)

关于c++ - 移动/拖动无框窗口? [Qt],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570802/

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