在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动

Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数

 1 void Widget::mousePressEvent(QMouseEvent *event)
 2 {
 3     if (event->button() == Qt::LeftButton) {
 4         pos = event->globalPos() - frameGeometry().topLeft();
 5         event->accept();
 6     }
 7 }
 8 
 9 void Widget::mouseMoveEvent(QMouseEvent *event)
10 {
11     if (event->buttons() & Qt::LeftButton) {
12         move(event->globalPos() - pos);
13         event->accept();
14     }
15 }

在上述简短的代码中,主要实现的功能就是,鼠标左键被按下时,记录下鼠标相对于窗口左上角的位置,拖动时获取鼠标当前的全局位置,并减去鼠标相对于窗口左上角的

位置,此时获取的就是窗口左上角拖动后应该在的全局位置,然后调用move函数,将窗口移动到正确的位置。这样,无边框窗口移动就实现了。

另外,frameGeometry().topLeft() 这个函数可以换成 pos()  , 两者返回相同 。有一点要注意的是 ,不能把 pos()  写成 event->pos() , 在实验的时候,

我犯了这个错误 , 结果花了一下午终于才查出来。

 

posted on 2013-06-30 01:56  wowk  阅读(1429)  评论(0编辑  收藏  举报