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

标签 c++ qt

我有一个非常简单的无窗口应用程序 (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/

相关文章:

c++ - union 和 struct 的字节大小

qt - 链接器错误LNK2001和LNK2019

c++ - 在 C++ 中组织涉及具有有限范围和模板的 const 引用的代码的好方法

c++ - Qt信号/插槽实际上如何与.ui文件中的元素耦合?

unit-testing - 我应该为 Qt 使用什么单元测试框架?

C++/Qt QDomDocument : iterate over all XML Tags

c++ - 停止 QNetworkRequest 缓冲整个请求

c++ - 使用 Google Test 检查类方法的调用

c++ - Qt Creator with FFmpeg 未解析的外部

分配后未更新 C++ 字符串大小