Qt - 移动无边框窗体

20 篇文章 0 订阅

移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下

网上的代码仅仅实现了两个事件

void EditDialog::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_DragPosition = event->globalPos() - this->pos();
        event->accept();
    }
}

void EditDialog::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() && Qt::LeftButton) {
        move(event->globalPos() - m_DragPosition);
        event->accept();
    }
}

但是这样就会有一个问题,就是当鼠标在一个实现了mousePressEvent的类上点击时(比如QPushButton)会被该类优先处理此事件

而不会将事件传递到窗体的mousePressEvent中。继续,当移动鼠标到这个按钮外时(假设点在了QPushButton上)会触发窗体的mouseMoveEvent

从而导致计算坐标时发生错误,此时你就会看到窗体闪了一下,变动了位置,鼠标也没有停在前面按下的按钮之上。

解决办法也很简单,就是再多声明一个bool变量来判断,并实现mouseReleaseEvent即可

void EditDialog::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_Drag = true;
        m_DragPosition = event->globalPos() - this->pos();
        event->accept();
    }
}

void EditDialog::mouseMoveEvent(QMouseEvent *event)
{
    if (m_Drag && (event->buttons() && Qt::LeftButton)) {
        move(event->globalPos() - m_DragPosition);
        event->accept();
    }
}

void EditDialog::mouseReleaseEvent(QMouseEvent *)
{
    m_Drag = false;
}


这样,就完成了无边框窗体的拖动。可是,这样做的效率并不高,因为鼠标每次move时都会触发事件,计算位置,移动窗口,重绘窗口……

当窗体上有QWebView部件时,特别是网页中有图片,Flash时,你就会发现用上面的方案去移动窗体时会非常不流畅。

 

如果不考虑跨平台,只针对Windows平台,那么我建议用Windows下的标准方法,模拟标题栏移动消息,既简单又高效

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (ReleaseCapture())
        SendMessage(HWND(this->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
    event->ignore();
}

 这样,在拖动窗体时只会在松开鼠标时才将窗体移动过去,这样就避免了第一种方法的低效率问题

转自: http://blog.csdn.net/aqtata/article/details/8902889
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值