Qt 对话框无边框,背景透明,不在任务栏显示,当点击对话框之外区域对话框关闭

1. 对话框无边框

通过设置窗体标志实现,函数原型如下:

void QWidget::setWindowFlag(Qt::WindowType flag, bool on = true)

参数解释:

  • flag : 标志
  • on : on为真,则设置此小部件上的窗口标志;否则清除标志。

常见Qt::WindowType 如下:
enum Qt::WindowType:
此枚举类型用于为widget指定各种窗口系统属性。它们相当特殊,但在少数情况下是必要的。其中一些标志取决于底层窗口管理器是否支持它们。

枚举类型 描述
Qt::Widget 0x00000000 这是QWidget的默认类型。这种类型的小部件如果有父部件就是子部件,如果没有父部件就是独立的窗口。
Qt::Window 0x00000001 指示该小部件是一个窗口,通常具有窗口系统框架和标题栏,而不管该小部件是否有父窗体。请注意,如果小部件没有父节点,则无法取消此标志的设置。
Qt::Dialog 0x00000002 Window 表示小部件是一个应该被装饰为对话框的窗口(即通常在标题栏中没有最大化或最小化按钮)。这是QDialog的默认类型。如果想将其用作模态对话框,应该从另一个窗口启动它,或者将其作为QWidget的子窗口,并使用windowModality属性。如果将其设置为模态对话框,该对话框将阻止应用程序中的其他顶级窗口获得任何输入。我们将具有父窗口的顶级窗口称为次级窗口。
Qt::Popup 0x00000008 Window 表示小部件是一个弹出式的顶级窗口,即它是模态的,但具有适用于弹出菜单的窗口系统框架。
Qt::Tool Popup Dialog 表示小部件是一个工具窗口。工具窗口通常是一个带有较小标题栏和装饰的小窗口,通常用于工具按钮的集合。如果有父窗口,工具窗口将始终保持在其上方。如果没有父窗口,您可以考虑同时使用Qt::WindowStaysOnTopHint。如果窗口系统支持,工具窗口可以用较轻的框装饰。它也可以与Qt::FramelessWindowHint结合使用。在macOS上,工具窗口对应于浮动窗口类。这意味着该窗口位于普通窗口之上的级别,使得无法将普通窗口置于其上方。默认情况下,当应用程序处于非活动状态时,工具窗口将会消失。可以通过Qt::WA_MacAlwaysShowToolWindow属性来控制此行为。
Qt::ToolTip Popup Sheet 表示小部件是一个工具提示。这在内部用于实现工具提示功能。
Qt::SplashScreen ToolTip Dialog 表示窗口是一个启动画面。这是QSplashScreen的默认类型。
Qt::Desktop 0x00000010 Window 表示此小部件是桌面。这是QDesktopWidget的类型。
Qt::SubWindow 0x00000012 表示此小部件是一个子窗口,如QMdiSubWindow小部件。
Qt::ForeignWindow 0x00000020 Window 表示该窗口对象是一个句柄,代表由另一个进程或手动使用本机代码创建的本机平台窗口。
Qt::CoverWindow 0x00000040 Window 表示窗口表示一个覆盖窗口,在某些平台上当应用程序最小化时会显示。
Qt::FramelessWindowHint 0x00000800 产生一个无边框的窗口。用户无法通过窗口系统移动或调整大小无边框的窗口。在X11上,该标志的结果取决于窗口管理器及其理解Motif和/或NETWM提示的能力。大多数现代窗口管理器都能处理此功能。
Qt::NoDropShadowWindowHint 0x40000000 禁用支持平台上的窗口投影阴影效果。
Qt::WindowShadeButtonHint 0x00020000 如果底层窗口管理器支持最小化按钮,则在最小化按钮的位置添加阴影按钮。
Qt::WindowStaysOnTopHint 0x00040000 通知窗口系统该窗口应该保持在所有其他窗口的顶部。
Qt::WindowStaysOnBottomHint 0x04000000 通知窗口系统该窗口应该位于所有其他窗口的底部。

以上是一些常用的WindowType,还有很多,可以根据实际使用的情况进行设置。

调用很简单,一般在构造里调用如下:

setWindowFlags(Qt::FramelessWindowHint);

显示效果:
在这里插入图片描述

2. 对话框背景透明

需要设置窗体属性,函数原型如下:

void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on = true)

参数解释:

  • attribute : 需要设置的属性值
  • on : on为真,则设置此小部件上的属性;否则清除该属性。

调用:

setAttribute(Qt::WA_TranslucentBackground); // 设置背景透明

加上刚才的无边框,显示如下:
在这里插入图片描述

3. 不在任务栏显示

有三种方式可以实现不在任务栏显示启动的程序。

  • Qt::Popup
  • Qt::Tool
  • Qt::SubWindow
    // 设置不在任务栏显示、无边框、顶层显示
    setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    // 设置背景透明
    setAttribute(Qt::WA_TranslucentBackground);

4. 点击对话框之外关闭对话框

设置为Qt::Popup,点击窗口外区域,会自动关闭对话框,但设置为Qt::Popup后,窗体会有阴影,可再设置Qt::NoDropShadowWindowHint关闭阴影。

setWindowFlags(Qt::Popup| Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);

但如果只有一个窗体,设置为Qt::Popup,点击对话框外,对话框消失了,但未关闭,任务管理器还可以看到。
因此,可以重写对话框事件进行实现:
在构造里设置:

    // 设置不在任务栏显示、无边框、顶层显示
    setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    // 设置背景透明
    setAttribute(Qt::WA_TranslucentBackground);

重写bool event(QEvent *event)方法:

    bool event(QEvent *event)
{
    
    
	// 当事件类型改变
        if (event->type() == QEvent::ActivationChange)
        {
    
    
		// 活动窗体改变
            if(QApplication::activeWindow() != this)
            {
    
    
		// 关闭,但任务管理器还在
                this->close();
		// 退出事件循环,彻底关闭
                QApplication::quit();
            }
        }
        return QDialog::event(event);
    }

除此之外,还可以使用事件过滤器进行实现,实现方式和上述类似。

猜你喜欢

转载自blog.csdn.net/MrHHHHHH/article/details/135286191