【已解决】Qt无边框MainWindow如何拖动四周改变大小?
Chinese
5
Posts
3
Posters
13.3k
Views
1
Watching
-
我做了一个FrameLess的MainWindow,只是想做个类似于Photoshop那样的窗体,但是现在我无法像正常的窗口一样改变大小。只有一个状态栏右下角的那个东西能改变大小。
我想要做成和正常窗体一样。四角都能改变大小 ,四边也能拖动改变大小的窗体,我试过使用CustomizeWindowHint,但是在我的Ubuntu上没有任何效果。究其原因应该是X11的问题。求教各位大侠我应该怎么办?
(我用MousePress之类的事件写了一个很简陋的改变,但是漏洞太多了……)
——————————————————————
解决方法:
参照以前版本的Qt中一个DragProxy仿写一个即可。 -
想知道LZ究竟是用什么方法制作一个自定义样式的窗口?
是用QSS实现的吗? -
-
你需要重新处理部分窗体事件,以下代码适用于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); }
}
@