起源
有网友问:
QWidget w1;
QWidget w2(&w1, Qt::Window);
两个顶级窗体,前者会在任务栏显示,后者却不会,如何让后者也在任务栏显示?
首先提一下:这个效果是平台相关的,他的描述应该是Windows的结果,Linux下应该没有这个区别。
简单理理
接漫谈QWidget及其派生类(一),QWidget
中窗口可按有无parent分两种:
primary window
|
无 parent
|
会自动设置Qt::Window标记
|
secondary window
|
有 parent
|
对于普通的QWidget,需手动设置Qt::Window标记
对于QMainWindow及QDialog,其构造函数中已经设置了该标记,故可以直接用
|
win32
在Win32下,窗口的创建是通过CreateWindowEx完成的:
HWND WINAPI CreateWindowEx(
__in DWORD dwExStyle,
__in_opt LPCTSTR lpClassName,
__in_opt LPCTSTR lpWindowName,
__in DWORD dwStyle,
__in int x,
__in int y,
__in int nWidth,
__in int nHeight,
__in_opt HWND hWndParent,
__in_opt HMENU hMenu,
__in_opt HINSTANCE hInstance,
__in_opt LPVOID lpParam
);
注意其中的参数:hWndParent 和 dwStyle
dwStyle 指定窗口风格
|
WS_OVERLAPPED 对应 Qt::Window
|
hWndParent
|
自然而然对应 对应Qt中的父子关系
|
WS_OVERLAPPED 风格 + hWndParent 就是 所谓的 Owned Windows 了:
Owned Windows
An overlapped or pop-up window can be owned by another overlapped or pop-up window. Being owned places several constraints on a window.
An owned window is always above its owner in the z-order.
The system automatically destroys an owned window when its owner is destroyed.
An owned window is hidden when its owner is minimized.
Only an overlapped or pop-up window can be an owner window; a child window cannot be an owner window. An application creates an owned window by specifying the owner's window handle as the hwndParent parameter of CreateWindowEx when it creates a window with the WS_OVERLAPPED or WS_POPUP style.
涉及到的Windows api函数还有:
-
SetParent()
-
SetWindowLong()
- ...
注:Qt中相关源码见 qwidget_win.cpp 中的 QWidgetPrivate::create_sys() 及 QWidgetPrivate::setParent_sys()等
X11
在X11下,窗口的创建
Window XCreateWindow(display, parent, x, y, width, height, border_width, depth,
class, visual, valuemask, attributes)
Display *display;
Window parent;
int x, y;
unsigned int width, height;
unsigned int border_width;
int depth;
unsigned int class;
Visual *visual
unsigned long valuemask;
XSetWindowAttributes *attributes;
尽管这个也有一个parent参数,但和Win32下的含义是不同的。对于每一个顶级窗口都需要以 root 窗口为 parent (fixme)
从 Qt 源码 QWidgetPrivate::create_sys()可见到这样的片段:
parentw = topLevel ? root_win : parentWidget->effectiveWinId();
....
id = (WId)qt_XCreateWindow(q, dpy, parentw,
safeRect.left(), safeRect.top(),
safeRect.width(), safeRect.height(),
0, xinfo.depth(), InputOutput,
(Visual *) xinfo.visual(),
CWBackPixel|CWBorderPixel|CWColormap,
&wsa);
....
参考
分享到:
相关推荐
在Qt框架下,`QWidget`和`QML`是两种不同的UI表示技术。`QWidget`是C++中的组件,主要用于构建传统的图形用户界面,而`QML`是一种声明式语言,用于创建现代、动态和触控友好的用户界面。将`QWidget`嵌入到`QML`中...
在Qt编程环境中,`QWidget`是基础的用户界面元素,用于构建复杂的图形用户界面。有时候,当`QWidget`内部的内容过大无法一次性显示时,我们可能需要为其添加滚动条以实现内容的平滑滚动。本教程将详细介绍如何为`...
在本文中,我们将深入探讨如何使用Qt库中的`QWidget`,`QPainter`,`QPropertyAnimation`以及`QTransform`来实现一个翻转效果。这个主题是针对那些希望提升其在GUI应用开发中动画技能的开发者,特别是使用C++和Qt...
在Qt框架中,QML(Qt Meta Language)和QWidget是两种不同的UI表示方式。QML是一种基于JSON的声明式语言,用于构建具有丰富图形界面的应用程序,而QWidget是C++中的一个类,它是Qt GUI编程的核心组件。在某些场景下...
在QT编程中,`QWidget` 是一个非常基础且重要的组件,它是所有用户界面(UI)元素的基类。本示例“2个QWidget相互切换显示.zip”提供了如何在QT应用程序中实现两个`QWidget`对象之间的动态切换,同时保持每个`...
**QML与QWidget交互** 在Qt开发中,QML(Quick Markup Language)和QWidget是两种主要的用户界面(UI)构建技术。QML是Qt Quick的一部分,它提供了一种声明式语言来创建富媒体和动态的图形用户界面,而QWidget是Qt...
在Qt开发中,QML(Qt Meta Language)和QWidget是两种不同的UI表示方式。QML是一种基于JSON的声明式语言,用于构建具有丰富图形界面的应用程序,而QWidget是C++中的一个类,它是Qt GUI系统的基础,用于创建窗口和...
然而,有时我们可能需要在QML中使用C++实现的复杂功能,这时就可以引入QWidget控件。本文将深入探讨如何在QML中使用QWidget控件,并通过`QmlWidget.cpp`和`QmlWidget.h`这两个文件来展示具体的实现细节。 首先,让...
相比之下,QMainWindow 是 QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一...
在Qt编程中,`QWidget`是所有用户界面元素的基础类,它提供了基本的窗口功能,如绘制、事件处理等。然而,在尝试通过样式表(QSS,Qt Style Sheets)来改变`QWidget`及其子类的外观时,有时会遇到一些问题,特别是当...
在Qt库中,QWidget是构建用户界面的基本组件。它提供了窗口、绘图和事件处理的能力。本主题将深入探讨如何实现两个QWidget之间的内容交换显示,这在设计动态用户界面时非常常见,例如在不同的视图间切换或者实现某些...
在Qt开发环境中,将`QWidget`与`QML`结合使用是构建混合界面的一种常见方法。`QWidget`是Qt库中的一个核心类,用于创建窗口和控件,而`QML`是一种声明式语言,主要用于设计用户界面。`QWidget`嵌入`QML`能够充分利用...
将Lottie-web用QML封装了一层,将Qt的signal与Lottie的事件(播放、暂停...)对接起来,Lottie-web支持QML,不支持Qwidget,所以想QWidget使用就需要QWidget嵌套QML来调用Lottie库,可以实现显示josn动画效果。
注意,为了在Windows和macOS等不同平台上保持一致的效果,可能需要根据系统风格动态调整模糊半径和阴影偏移。 最后,将自定义的`CustomHeader`和`GlassWidget`组合到一起,形成完整的窗口。这可以通过布局管理器...
这段代码告诉Qt我们不希望使用默认的窗口装饰(如标题栏),同时希望窗口始终位于其他窗口之上。 接下来,为了实现窗口的拖动功能,我们需要监听鼠标事件。当鼠标移动到窗口边缘时,我们可以改变鼠标形状,表示用户...
这个"Qt例程源代码QWidget.7z"压缩包显然是一个包含Qt编程示例的资源,特别是关于QWidget类的使用。QWidget是Qt GUI库中的基础组件,它是所有用户界面对象的基类,包括按钮、文本框、菜单等。 在Qt中,QWidget主要...
这个示例项目适用于Windows 10操作系统,使用Visual Studio 2010作为开发工具,并基于QT 5.5.1库。 首先,让我们了解QML(Qt Meta Language)。QML是一种声明性的语言,用于构建用户界面,它提供了丰富的图形效果和...
QWidget是所有用户界面对象的基类,而QtQWidget则是Qt库中的一个关键部分,它封装了与Windows系统底层交互的细节。本文将深入探讨QWidgets和QtQWidget在QT框架中的作用、实现方法以及相关的编程知识点。 首先,...
在Qt框架中,`QWidget` 是一个基础的用户界面组件,可以用来构建各种复杂的图形用户界面。本示例中,我们关注的是一个扩展了`QWidget` 的类,它增加了显示图片、支持缩放、拖动以及右键菜单的功能。这个自定义的组件...
在Qt库中,`QWidget`类是所有用户界面对象的基础,它是构建图形用户界面(GUI)的核心组件。这个压缩包文件“026 QWidget类分析显示和隐藏接口说明线程类QThread使用方法”显然是针对Qt开发者的,旨在详细解释`...