QT Mac TitleBar 处理
2020-06-08 本文已影响0人
哦呵呵y
一、 QWidget 相关方法 setWindowFlags
- 设置无边框、透明背景
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
setAttribute(Qt::WA_TranslucentBackground, true);
- QDialog 默认没有最小化按钮,且不能全屏
setWindowFlags(windowFlags() & ~Qt::Dialog);
setWindowFlags(windowFlags() | Qt::Window | Qt::WindowFullscreenButtonHint);
![](https://img.haomeiwen.com/i6666435/4a51d1e41f004d35.png)
![](https://img.haomeiwen.com/i6666435/401a084ce74c15c0.png)
在mac中 TitleBar 默认是独立在页面之外的,要想实现类似QQ这种内嵌到页面中的,需要使用Mac原生的API。暂时没有找到怎么用QT实现。
- 通过QWidget获取Window
NSView *view = (NSView *) widget->winId();
NSWindow *window = [view window];
- 设置TitleBar 透明
window.titlebarAppearsTransparent = YES;
- 隐藏标题
window.titleVisibility = NSWindowTitleHidden;
- 设置按钮融合进页面
// NSWindowStyleMaskFullSizeContentView 设置TitleBar不额外占用空间
window.styleMask = NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable
| NSWindowStyleMaskResizable | NSWindowStyleMaskTitled
| NSWindowStyleMaskFullSizeContentView;
- 设置window透明背景
window.opaque = NO;
window.backgroundColor = [NSColor clearColor];
- 修改按钮禁用
NSButton *button = [window standardWindowButton:NSWindowZoomButton];
[button setEnabled:NO];
- TitleBar默认高度很低,也无法修改。如果要像QQ一样将系统按钮移动位置,需要获取到系统按钮,加入到自己的页面上
设置window 代理
window.delegate = [YSWindowDelegate defalut];
window 全屏化之后 按钮又会重新回到原始状态,所以需要在回调中 重新修改按钮的位置
- (void)windowWillExitFullScreen:(NSNotification *)notification {
NSWindow *window = notification.object;
NSButton *button1 = [window standardWindowButton:NSWindowZoomButton];
button1.hidden = YES;
NSButton *button2 = [window standardWindowButton:NSWindowCloseButton];
button2.hidden = YES;
NSButton *button3 = [window standardWindowButton:NSWindowMiniaturizeButton];
button3.hidden = YES;
}
- (void)windowDidExitFullScreen:(NSNotification *)notification {
NSLog(@"windowDidExitFullScreen --%@", notification);
NSWindow *window = notification.object;
NSButton *button = [window standardWindowButton:NSWindowZoomButton];
button.hidden = NO;
button.frame = NSMakeRect(button.frame.origin.x, 30, button.frame.size.width, button.frame.size.height);
[self.view addSubview:button];
NSButton *button1 = [window standardWindowButton:NSWindowCloseButton];
button1.hidden = NO;
button1.frame = NSMakeRect(button1.frame.origin.x, 30, button1.frame.size.width, button1.frame.size.height);
[self.view addSubview:button1];
NSButton *button2 = [window standardWindowButton:NSWindowMiniaturizeButton];
button2.hidden = NO;
button2.frame = NSMakeRect(button2.frame.origin.x, 30, button2.frame.size.width, button2.frame.size.height);
[self.view addSubview:button2];
}
- 默认情况TitleBar 只有22的高度,通过以下方法可以调整TitleBar的高度,这个时候就可以调整系统按钮的坐标,也可以在titlebar上面添加视图
NSTitlebarAccessoryViewController *vc = [[NSTitlebarAccessoryViewController alloc] init];
vc.view = [[NSView alloc] initWithFrame:((NSView *)window.contentView).frame];
[window addTitlebarAccessoryViewController:vc];
NSButton *button = [window standardWindowButton:NSWindowZoomButton];
NSRect rect = button.frame;
rect.origin.y -= 30;
button.frame = rect;