【已解决】Qt无边框MainWindow如何拖动四周改变大小?



  • 我做了一个FrameLess的MainWindow,只是想做个类似于Photoshop那样的窗体,但是现在我无法像正常的窗口一样改变大小。只有一个状态栏右下角的那个东西能改变大小。

    我想要做成和正常窗体一样。四角都能改变大小 ,四边也能拖动改变大小的窗体,我试过使用CustomizeWindowHint,但是在我的Ubuntu上没有任何效果。究其原因应该是X11的问题。求教各位大侠我应该怎么办?

    (我用MousePress之类的事件写了一个很简陋的改变,但是漏洞太多了……)
    ——————————————————————
    解决方法:
    参照以前版本的Qt中一个DragProxy仿写一个即可。



  • 想知道LZ究竟是用什么方法制作一个自定义样式的窗口?
    是用QSS实现的吗?



  • [quote author="jiangcaiyang" date="1373809087"]想知道LZ究竟是用什么方法制作一个自定义样式的窗口?
    是用QSS实现的吗?[/quote]

    抱歉,我是用一个FramelessWindowHint和一个自己写的Style来实现的。就是因为用了FrameLessWindowHint结果才出现的各种问题,移动和最大最小化的问题都已经解决了。现在就是差一个大小调整的东西了。记得原来还有个很方便的调整大小的Frame还是什么直接设一个就可以了。Qt5里面好像把这个给删去了。



  • [quote author="jiangcaiyang" date="1373809087"]想知道LZ究竟是用什么方法制作一个自定义样式的窗口?
    是用QSS实现的吗?[/quote]

    您知道怎么实现这个效果么?感激不尽啊QAQ



  • 你需要重新处理部分窗体事件,以下代码适用于Windows平台,仅供参考!

    @

    bool MainWindow::winEvent(MSG *msg, long *result)
    {
    switch (msg->message)
    {
    case WM_NCHITTEST:
    {
    *result = 0;
    const LONG border_width = 8; //in pixels
    RECT winrect;
    GetWindowRect(winId(), &winrect);

        long x = GET_X_LPARAM(msg->lParam);
        long y = GET_Y_LPARAM(msg->lParam);
    
        bool resizeWidth = minimumWidth() != maximumWidth();
        bool resizeHeight = minimumHeight() != maximumHeight();
        if(resizeWidth)
        {
            //left border
            if (x >= winrect.left && x < winrect.left + border_width)
            {
                *result = HTLEFT;
            }
            //right border
            if (x < winrect.right && x >= winrect.right - border_width)
            {
                *result = HTRIGHT;
            }
        }
        if(resizeHeight)
        {
            //bottom border
            if (y < winrect.bottom && y >= winrect.bottom - border_width)
            {
                *result = HTBOTTOM;
            }
            //top border
            if (y >= winrect.top && y < winrect.top + border_width)
            {
                *result = HTTOP;
            }
        }
        if(resizeWidth && resizeHeight)
        {
            //bottom left corner
            if (x >= winrect.left && x < winrect.left + border_width &&
                    y < winrect.bottom && y >= winrect.bottom - border_width)
            {
                *result = HTBOTTOMLEFT;
            }
            //bottom right corner
            if (x < winrect.right && x >= winrect.right - border_width &&
                    y < winrect.bottom && y >= winrect.bottom - border_width)
            {
                *result = HTBOTTOMRIGHT;
            }
            //top left corner
            if (x >= winrect.left && x < winrect.left + border_width &&
                    y >= winrect.top && y < winrect.top + border_width)
            {
                *result = HTTOPLEFT;
            }
            //top right corner
            if (x < winrect.right && x >= winrect.right - border_width &&
                    y >= winrect.top && y < winrect.top + border_width)
            {
                *result = HTTOPRIGHT;
            }
        }
    
        if(*result == 0)
          return  QWidget::winEvent(msg,result);
    
        return true;
        break;
    } //end case WM_NCHITTEST
    default:
        return QWidget::winEvent(msg,result);
    }
    

    }
    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.