我有一个非常简单的应用程序,即无窗口(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);
然后我创建了我的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
定义了按钮的一些绝对位置。
答案 0 :(得分:2)
QPushButton
似乎吸收了新闻事件,但未将其传递给其父窗口小部件。因此,在这种情况下,父窗口小部件不会收到有关鼠标按下事件的通知。解决此问题的一个简单方法是使用Qt event filters。您可以在QPushButton
上安装一个事件过滤器,可以将其视为此按钮的所有事件的入口点。
因此,工作流程如下:
m_nMouseClick_X_Coordinate
和m_nMouseClick_Y_Coordinate
个变量。然后将事件重定向到按钮。现在,我们应该这样做:
我将把剩下的作为练习留给你。 :)