zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之自定义界面(窗体缩放)

Qt 自定义 界面 窗体 缩放
2023-09-14 08:56:50 时间

通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭。

在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左、上、右、下、左上角、左下角、右上角、右下角时候,鼠标变为相应的样式,并且窗体可以随着鼠标拖动而进行放大、缩小。


bool Widget::nativeEvent(const QByteArray eventType, void *message, long *result)

 Q_UNUSED(eventType)

 MSG *param = static_cast MSG * (message);

 switch (param- message)

 case WM_NCHITTEST:

 int nX = GET_X_LPARAM(param- lParam) - this- geometry().x();

 int nY = GET_Y_LPARAM(param- lParam) - this- geometry().y();

 // 鼠标区域位于标题栏按钮之上,则不进行处理

 QList QPushButton * buttons = m_pTitleBar- findChildren QPushButton * 

 foreach (QPushButton *pButton, buttons)

 if (pButton- geometry().contains(QPoint(nX, nY)))

 *result = HTCLIENT;

 return true;

 // 鼠标区域位于标题栏中,进行移动

 if (nX = m_nBorder nX = this- width() - m_nBorder

 nY = m_nBorder nY = m_pTitleBar- height())

 *result = HTCAPTION;

 return true;

 // 鼠标区域位于窗体边框,进行缩放

 if ((nX 0) (nX m_nBorder))

 *result = HTLEFT;

 if ((nX this- width() - m_nBorder) (nX this- width()))

 *result = HTRIGHT;

 if ((nY 0) (nY m_nBorder))

 *result = HTTOP;

 if ((nY this- height() - m_nBorder) (nY this- height()))

 *result = HTBOTTOM;

 if ((nX 0) (nX m_nBorder) (nY 0)

 (nY m_nBorder))

 *result = HTTOPLEFT;

 if ((nX this- width() - m_nBorder) (nX this- width())

 (nY 0) (nY m_nBorder))

 *result = HTTOPRIGHT;

 if ((nX 0) (nX m_nBorder)

 (nY this- height() - m_nBorder) (nY this- height()))

 *result = HTBOTTOMLEFT;

 if ((nX this- width() - m_nBorder) (nX this- width())

 (nY this- height() - m_nBorder) (nY this- height()))

 *result = HTBOTTOMRIGHT;

 return true;

 return QWidget::nativeEvent(eventType, message, result);

}

nativeEvent主要用于进程间通信-消息传递。在这里我们主要进行窗体缩放,其中还添加了一些限制,比如:


使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码-在mousePressEvent中使用SendMessage来进行移动。

当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。


C/C++ Qt MdiArea 多窗体组件应用 MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。
C/C++ Qt TabWidget 实现多窗体创建 在开发窗体应用时通常会伴随分页,TabWidget组件配合自定义Dialog组件,可实现一个复杂的多窗体分页结构,此类结构也是ERP等软件通用的窗体布局方案。
Qt编写自定义控件48-面板窗体控件 很多时候需要有一个控件,能够替代容器控件,自动容纳多个widget,自适应宽高,然后提供滚动条功能,这就必然需要用到QScrollArea控件,可设置各个子面板的间距等,也在很多系统中用到,比如温湿度设备面板,有几百个温湿度设备,需要一个容器放置,自动产生滚动条,可以设置面板的固定宽高或者自适应拉伸,其实就是放了表格布局+弹簧来设置。
Qt编写数据可视化大屏界面电子看板6-窗体打开关闭 二级窗体的打开与关闭,这个功能也很有必要,由于整个系统中各种模块数量窗体数量比较多,后期可能还会增加更多,在4K屏幕上可以显示很多的模块,但是有时候有些模块不想显示出来,就需要将该模块关闭掉,直接在二级窗体的标题栏上增加关闭按钮,可能会影响整体的布局,此时提供鼠标右键菜单来控制各个模块的...