qt自定义窗口的标题栏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们
可以自定义标题栏,这里提供一个简单的例子!
例子比较简,大致思路是正常创建窗口后,屏蔽标题栏,通过布局将一个QLabel和三个按钮构成一个“标题栏”
放置在顶端(视个人喜好,位置可以任意放置),重新实现必要的事件。
下面分步骤进行:
1. 创建窗口,屏蔽标题栏
例子中是创建了一个MainWindow窗口,构造过程中传入Qt::FramelessWindowHint 参数.
customTitleBar::customTitleBar(QWidget
*parent, Qt::WFlags flags) : QMainWindow(parent, Qt::FramelessWindowHint)
{
ui.setupUi(this);
ui.menuBar->hide(); ui.statusBar->hide();
......
}
2. 将自定义的“标题栏”放入窗口中
这里我们直接用QDeisgner进行设计,设计完成后利用布局将其置于顶端即可.
3. 事件处理在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动,
所以只重写鼠标事件: 单击、释放、双击和移动。
view plaincopy to clipboardprint?
1./*
2. QRect rect = ui.titleFrame->frameRect();
3. if(rect.contains(event->pos()));
4.这两句就是用于判断鼠标位置是否落在“标题栏”内。
5.*/
6.void Qt_Test::mousePressEvent(QMouseEvent *event)
7.{
8. if(event->button() == Qt::LeftButton)
9. {
10. dragPosition = event->globalPos() - frameGeometry().topLeft();
11.
12. QRect rect = ui.titleFrame->frameRect();
13. if(rect.contains(event->pos()))
14. {
15. m_bMoveable = true;
16. }
17. event->accept();
18. }
19.}
20.
21.void Qt_Test::mouseMoveEvent(QMouseEvent *event)
22.{
23. if(event->buttons() & Qt::LeftButton && !m_bMaximized && m_bMoveable)
24. {
25. move(event->globalPos() - dragPosition);
26. event->accept();
27. }
28.}
29.
30.void Qt_Test::mouseReleaseEvent(QMouseEvent* event)
31.{
32. if(m_bMoveable)
33. {
34. m_bMoveable = false;
35. }
36.}
37.
38.// 鼠标双击事件直接调用了还原按钮的事件
39.void Qt_Test::mouseDoubleClickEvent(QMouseEvent* event)
40.{
41. QRect rect = ui.titleFrame->frameRect();
42. if(rect.contains(event->pos()))
43. {
44. on_restoresize_clicked();
45. }
46.}
47./*
48.此例子是在Windows下编写,所以直接调用了Win32 API;
49.且只是假设任务栏在底端 :)
50.*/
51.void Qt_Test::on_restoresize_clicked()
52.{
53. if(m_bMaximized)
54. {
55. setGeometry(m_preRect);
56. m_bMaximized = false;
57. }
58. else
59. {
60. m_preRect = geometry();
61. WINDOWINFO wf;
62. ::GetWindowInfo(FindWindow(L"Shell_TrayWnd", NULL), &wf);
63. RECT trayRect = wf.rcWindow;
64. setGeometry(0, 0, trayRect.right+1, trayRect.top+1);
65. m_bMaximized = true;
66. }
67.}