qt自定义窗口的标题栏

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.}

相关文档
最新文档