我有一个非常简单的无窗口应用程序 (setWindowFlags(Qt::FramelessWindowHint);
) 并且有一个 QPushButton
。
我使用以下代码使整个窗口可拖动:
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
上安装一个事件过滤器,它可以被视为此按钮的所有事件的入口点。
因此,工作流程如下:
- 用户按下鼠标点击按钮。
- 鼠标按下事件被传送到我们的事件过滤器。
- 我们的事件过滤器更新
m_nMouseClick_X_Coordinate
和m_nMouseClick_Y_Coordinate
变量。然后将事件重定向到按钮。 - 按钮接收事件...
现在,我们应该做:
- 定义我们的事件过滤器类。
- 并实现其过滤器方法。
我会把剩下的留给你作为练习。 :)
关于c++ - 移动/拖动无框窗口? [Qt],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570802/