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);
}
除此之外,还可以使用事件过滤器进行实现,实现方式和上述类似。