C++/Qt

QT Mac TitleBar 处理

2020-06-08  本文已影响0人  哦呵呵y

一、 QWidget 相关方法 setWindowFlags

  1. 设置无边框、透明背景
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
    setAttribute(Qt::WA_TranslucentBackground, true);
  1. QDialog 默认没有最小化按钮,且不能全屏
    setWindowFlags(windowFlags() & ~Qt::Dialog);
    setWindowFlags(windowFlags() | Qt::Window | Qt::WindowFullscreenButtonHint);

默认TitleBar
QQ

在mac中 TitleBar 默认是独立在页面之外的,要想实现类似QQ这种内嵌到页面中的,需要使用Mac原生的API。暂时没有找到怎么用QT实现。

  1. 通过QWidget获取Window
    NSView *view = (NSView *) widget->winId();
    NSWindow *window = [view window];
  1. 设置TitleBar 透明
    window.titlebarAppearsTransparent = YES;
  1. 隐藏标题
    window.titleVisibility = NSWindowTitleHidden;
  1. 设置按钮融合进页面
// NSWindowStyleMaskFullSizeContentView 设置TitleBar不额外占用空间
    window.styleMask = NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable
                       | NSWindowStyleMaskResizable | NSWindowStyleMaskTitled
                       | NSWindowStyleMaskFullSizeContentView;
  1. 设置window透明背景
    window.opaque = NO;
    window.backgroundColor = [NSColor clearColor];
  1. 修改按钮禁用
NSButton *button = [window standardWindowButton:NSWindowZoomButton];
[button setEnabled:NO];
  1. 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];

}
  1. 默认情况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;

上一篇 下一篇

猜你喜欢

热点阅读