qt 无边框窗口拉伸,边缘抖动,边框晃动

上一篇已经介绍了如何使用无边框进行大小调整:https://labisart.com/blog/index.php/Home/Index/article/aid/252

不过这个解决方案有个小问题就是边框会抖动。

现在介绍下其他2个方法:

1、方法1,使用 Windows 原生的消息,实现 WM_NCHITTEST 消息,典型方案在这里,没测试过:

https://stackoverflow.com/questions/43505580/qt-windows-resizable-frameless-window

bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
    MSG* msg = static_cast<MSG*>(message);    if (msg->message == WM_NCHITTEST)
    {        
        if (isMaximized())
        {            return false;
        }

        *result = 0;        const LONG borderWidth = 8;
        RECT winrect;        GetWindowRect(reinterpret_cast<HWND>(winId()), &winrect);        // must be short to correctly work with multiple monitors (negative coordinates)
        short x = msg->lParam & 0x0000FFFF;        short y = (msg->lParam & 0xFFFF0000) >> 16;        bool resizeWidth = minimumWidth() != maximumWidth();        bool resizeHeight = minimumHeight() != maximumHeight();        if (resizeWidth)
        {            //left border
            if (x >= winrect.left && x < winrect.left + borderWidth)
            {
                *result = HTLEFT;
            }            //right border
            if (x < winrect.right && x >= winrect.right - borderWidth)
            {
                *result = HTRIGHT;
            }
        }        if (resizeHeight)
        {            //bottom border
            if (y < winrect.bottom && y >= winrect.bottom - borderWidth)
            {
                *result = HTBOTTOM;
            }            //top border
            if (y >= winrect.top && y < winrect.top + borderWidth)
            {
                *result = HTTOP;
            }
        }        if (resizeWidth && resizeHeight)
        {            //bottom left corner
            if (x >= winrect.left && x < winrect.left + borderWidth &&
                y < winrect.bottom && y >= winrect.bottom - borderWidth)
            {
                *result = HTBOTTOMLEFT;
            }            //bottom right corner
            if (x < winrect.right && x >= winrect.right - borderWidth &&
                y < winrect.bottom && y >= winrect.bottom - borderWidth)
            {
                *result = HTBOTTOMRIGHT;
            }            //top left corner
            if (x >= winrect.left && x < winrect.left + borderWidth &&
                y >= winrect.top && y < winrect.top + borderWidth)
            {
                *result = HTTOPLEFT;
            }            //top right corner
            if (x < winrect.right && x >= winrect.right - borderWidth &&
                y >= winrect.top && y < winrect.top + borderWidth)
            {
                *result = HTTOPRIGHT;
            }
        }        if (*result != 0)            return true;

        QWidget *action = QApplication::widgetAt(QCursor::pos());        if (action == this){
            *result = HTCAPTION;            return true;
        }
    }    return false;
}

理论上是没问题的,不过呢跨平台就比较蛋疼,我一般不用这种原生的解决方案,除非没办法了。


2、方法2,在Mainwindow上层显示一个widget,不过这个widget要透明显示,然后在paintEvent()中用QPainter画矩形边框,跟随鼠标走动,看起来就像是Mainwindow拉伸一样:

LYJ博客

这样代码就可以跨平台使用了。

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2022 labisart.com 版权所有 | 联系:labartwork@163.com