Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149495
  • 博文数量: 38
  • 博客积分: 136
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-10 22:36
个人简介

改变是痛苦的,不改变更加痛苦,不努力,别人想拉你一把,都找不到你手在哪,改变只为有梦想的人~

文章分类

全部博文(38)

文章存档

2015年(3)

2012年(35)

分类:

2012-04-22 10:54:31

因为标题栏属于窗口管理器控制,也就受限于操作系统, 所以直接利用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. 事件处理 在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动, 所以只重写鼠标事件: 单击、释放、双击和移动。

  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. }  

主要通过以上三步, 即可实现简易的自定义标题栏窗口!

阅读(6529) | 评论(0) | 转发(0) |
0

上一篇:c++ 设计模式

下一篇:tar 解压缩命令

给主人留下些什么吧!~~