因为标题栏属于窗口管理器控制,也就受限于操作系统, 所以直接利用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. 事件处理 在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动, 所以只重写鼠标事件: 单击、释放、双击和移动。
-
-
-
-
-
- void Qt_Test::mousePressEvent(QMouseEvent *event)
- {
- if(event->button() == Qt::LeftButton)
- {
- dragPosition = event->globalPos() - frameGeometry().topLeft();
-
- QRect rect = ui.titleFrame->frameRect();
- if(rect.contains(event->pos()))
- {
- m_bMoveable = true;
- }
- event->accept();
- }
- }
-
- void Qt_Test::mouseMoveEvent(QMouseEvent *event)
- {
- if(event->buttons() & Qt::LeftButton && !m_bMaximized && m_bMoveable)
- {
- move(event->globalPos() - dragPosition);
- event->accept();
- }
- }
-
- void Qt_Test::mouseReleaseEvent(QMouseEvent* event)
- {
- if(m_bMoveable)
- {
- m_bMoveable = false;
- }
- }
-
-
- void Qt_Test::mouseDoubleClickEvent(QMouseEvent* event)
- {
- QRect rect = ui.titleFrame->frameRect();
- if(rect.contains(event->pos()))
- {
- on_restoresize_clicked();
- }
- }
-
-
-
-
- void Qt_Test::on_restoresize_clicked()
- {
- if(m_bMaximized)
- {
- setGeometry(m_preRect);
- m_bMaximized = false;
- }
- else
- {
- m_preRect = geometry();
- WINDOWINFO wf;
- ::GetWindowInfo(FindWindow(L"Shell_TrayWnd", NULL), &wf);
- RECT trayRect = wf.rcWindow;
- setGeometry(0, 0, trayRect.right+1, trayRect.top+1);
- m_bMaximized = true;
- }
- }
主要通过以上三步, 即可实现简易的自定义标题栏窗口!
阅读(6500) | 评论(0) | 转发(0) |