Qt自定义外观--自定义标题栏的窗口
2011-12-13 17:13
330 查看
因为标题栏属于窗口管理器控制,也就受限于操作系统, 所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们
可以自定义标题栏, 这里提供一个简单的例子!
![](http://hi.csdn.net/attachment/201007/7/0_1278507198MxZa.gif)
例子比较简, 大致思路是正常创建窗口后, 屏蔽标题栏, 通过布局将 一个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进行设计, 设计完成后利用布局将其置于顶端即可.
![](http://hi.csdn.net/attachment/201007/7/0_1278507575F3db.gif)
3. 事件处理 在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动,
所以只重写鼠标事件: 单击、释放、双击和移动。
/*
QRect rect = ui.titleFrame->frameRect();
if(rect.contains(event->pos()));
这两句就是用于判断鼠标位置是否落在“标题栏”内。
*/
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();
}
}
/*
此例子是在Windows下编写, 所以直接调用了Win32 API;
且只是假设任务栏在底端 :)
*/
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;
}
}
主要通过以上三步, 即可实现简易的自定义标题栏窗口!
双击标题栏 最大化 与还原
可以自定义标题栏, 这里提供一个简单的例子!
![](http://hi.csdn.net/attachment/201007/7/0_1278507198MxZa.gif)
例子比较简, 大致思路是正常创建窗口后, 屏蔽标题栏, 通过布局将 一个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进行设计, 设计完成后利用布局将其置于顶端即可.
![](http://hi.csdn.net/attachment/201007/7/0_1278507575F3db.gif)
3. 事件处理 在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动,
所以只重写鼠标事件: 单击、释放、双击和移动。
/*
QRect rect = ui.titleFrame->frameRect();
if(rect.contains(event->pos()));
这两句就是用于判断鼠标位置是否落在“标题栏”内。
*/
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();
}
}
/*
此例子是在Windows下编写, 所以直接调用了Win32 API;
且只是假设任务栏在底端 :)
*/
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;
}
}
主要通过以上三步, 即可实现简易的自定义标题栏窗口!
最大化 最小化 还原 关闭 void menubar::on_pushButton_2_clicked() { showMinimized(); } void menubar::on_pushButton_clicked() { if (isMaximized()) { showNormal(); } else { showMaximized(); } }
双击标题栏 最大化 与还原
void menubar::mouseDoubleClickEvent ( QMouseEvent * e ) { if (e->button() == Qt:: LeftButton) { QPoint p = ui.widgetTitle->mapFromGlobal(QCursor::pos()); //获取当前鼠标点击是否在自定义的title上 if (ui.widgetTitle->geometry().contains(p,true)) { on_pushButton_clicked(); } } }
相关文章推荐
- Qt自定义外观--自定义标题栏的窗口
- WPF自定义标题栏——窗口移动和按钮状态转换
- Qt 之 自定义窗口标题栏 之 窗口拉伸
- 很好用的模态弹出窗口,可自定义弹出窗口外观
- QT自定义标题栏的可拖拽窗口
- Qt 无边框窗口自定义标题栏
- C#技巧:如何自定义窗口标题栏
- 修改应用程序外观 注册和使用自定义窗口结构体
- Win10怎么自定义窗口颜色?利用控制面板颜色和外观设置窗口颜色的方法
- JavaFX 之自定义窗口标题栏(二)
- QT自定义窗口标题栏实现拖动双击放大缩小
- 自定义窗口的玻璃效果(边框,标题栏...)
- Windows SDK应用程序窗口标题栏上显示自定义图标
- Android手机UI设计---”知乎“界面外观模仿篇(二)---在Fragment里使用自定义listview以及popupwindow弹出窗口
- 自定义窗口的玻璃效果(边框,标题栏...)
- 自定义窗口的玻璃效果(边框,标题栏...)
- WPF 自定义窗口标题栏
- 【Qt】自定义标题栏并实现最小化/最大化/关闭窗口功能
- AIR 自定义窗口的外观
- 在vc中如何自定义AfxMessgeBox的系统窗口外观