移动/拖动FramelessWindow? [Qt的]

时间:2016-02-23 06:58:46

标签: 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);

然后我创建了我的eventfilter:

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定义了按钮的一些绝对位置。

1 个答案:

答案 0 :(得分:2)

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

因此,工作流程如下:

  1. 用户按下按钮上的鼠标。
  2. 鼠标按下事件已发送到我们的事件过滤器。
  3. 我们的事件过滤器会更新m_nMouseClick_X_Coordinatem_nMouseClick_Y_Coordinate个变量。然后将事件重定向到按钮。
  4. 按钮收到活动......
  5. 现在,我们应该这样做:

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

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