`
tomhibolu
  • 浏览: 1431365 次
文章分类
社区版块
存档分类
最新评论

QWidget 之 Secondary Windows 小记

 
阅读更多

起源

有网友问:

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);
....

参考

分享到:
评论

相关推荐

    QWidget嵌入到QML中

    在Qt框架下,`QWidget`和`QML`是两种不同的UI表示技术。`QWidget`是C++中的组件,主要用于构建传统的图形用户界面,而`QML`是一种声明式语言,用于创建现代、动态和触控友好的用户界面。将`QWidget`嵌入到`QML`中...

    给QWidget加滚动条

    在Qt编程环境中,`QWidget`是基础的用户界面元素,用于构建复杂的图形用户界面。有时候,当`QWidget`内部的内容过大无法一次性显示时,我们可能需要为其添加滚动条以实现内容的平滑滚动。本教程将详细介绍如何为`...

    使用QWidget实现翻转

    在本文中,我们将深入探讨如何使用Qt库中的`QWidget`,`QPainter`,`QPropertyAnimation`以及`QTransform`来实现一个翻转效果。这个主题是针对那些希望提升其在GUI应用开发中动画技能的开发者,特别是使用C++和Qt...

    qwidget嵌入qml最完整代码

    在Qt框架中,QML(Qt Meta Language)和QWidget是两种不同的UI表示方式。QML是一种基于JSON的声明式语言,用于构建具有丰富图形界面的应用程序,而QWidget是C++中的一个类,它是Qt GUI编程的核心组件。在某些场景下...

    2个QWidget相互切换显示.zip

    在QT编程中,`QWidget` 是一个非常基础且重要的组件,它是所有用户界面(UI)元素的基类。本示例“2个QWidget相互切换显示.zip”提供了如何在QT应用程序中实现两个`QWidget`对象之间的动态切换,同时保持每个`...

    QML与QWidget交互

    **QML与QWidget交互** 在Qt开发中,QML(Quick Markup Language)和QWidget是两种主要的用户界面(UI)构建技术。QML是Qt Quick的一部分,它提供了一种声明式语言来创建富媒体和动态的图形用户界面,而QWidget是Qt...

    qwidget与qml交互

    在Qt开发中,QML(Qt Meta Language)和QWidget是两种不同的UI表示方式。QML是一种基于JSON的声明式语言,用于构建具有丰富图形界面的应用程序,而QWidget是C++中的一个类,它是Qt GUI系统的基础,用于创建窗口和...

    QWidget控件在QML中使用 控件

    然而,有时我们可能需要在QML中使用C++实现的复杂功能,这时就可以引入QWidget控件。本文将深入探讨如何在QML中使用QWidget控件,并通过`QmlWidget.cpp`和`QmlWidget.h`这两个文件来展示具体的实现细节。 首先,让...

    QWidget,QMainWindow和QDialog的区别

    相比之下,QMainWindow 是 QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一...

    QWidget样式表设置背景示例代码

    在Qt编程中,`QWidget`是所有用户界面元素的基础类,它提供了基本的窗口功能,如绘制、事件处理等。然而,在尝试通过样式表(QSS,Qt Style Sheets)来改变`QWidget`及其子类的外观时,有时会遇到一些问题,特别是当...

    两个QWidget互相交换显示

    在Qt库中,QWidget是构建用户界面的基本组件。它提供了窗口、绘图和事件处理的能力。本主题将深入探讨如何实现两个QWidget之间的内容交换显示,这在设计动态用户界面时非常常见,例如在不同的视图间切换或者实现某些...

    QWidget嵌入Qml界面.zip

    在Qt开发环境中,将`QWidget`与`QML`结合使用是构建混合界面的一种常见方法。`QWidget`是Qt库中的一个核心类,用于创建窗口和控件,而`QML`是一种声明式语言,主要用于设计用户界面。`QWidget`嵌入`QML`能够充分利用...

    Lottie-QWidget

    将Lottie-web用QML封装了一层,将Qt的signal与Lottie的事件(播放、暂停...)对接起来,Lottie-web支持QML,不支持Qwidget,所以想QWidget使用就需要QWidget嵌套QML来调用Lottie库,可以实现显示josn动画效果。

    QT C++ QWidget 自定义头窗口头标+毛玻璃效果

    注意,为了在Windows和macOS等不同平台上保持一致的效果,可能需要根据系统风格动态调整模糊半径和阴影偏移。 最后,将自定义的`CustomHeader`和`GlassWidget`组合到一起,形成完整的窗口。这可以通过布局管理器...

    QWidget无标题窗口,可随意缩放拖动

    这段代码告诉Qt我们不希望使用默认的窗口装饰(如标题栏),同时希望窗口始终位于其他窗口之上。 接下来,为了实现窗口的拖动功能,我们需要监听鼠标事件。当鼠标移动到窗口边缘时,我们可以改变鼠标形状,表示用户...

    Qt例程源代码QWidget.7z

    这个"Qt例程源代码QWidget.7z"压缩包显然是一个包含Qt编程示例的资源,特别是关于QWidget类的使用。QWidget是Qt GUI库中的基础组件,它是所有用户界面对象的基类,包括按钮、文本框、菜单等。 在Qt中,QWidget主要...

    QML离屏渲染QWidget示例.zip

    这个示例项目适用于Windows 10操作系统,使用Visual Studio 2010作为开发工具,并基于QT 5.5.1库。 首先,让我们了解QML(Qt Meta Language)。QML是一种声明性的语言,用于构建用户界面,它提供了丰富的图形效果和...

    qwidgets_qwidget和qwidgets_qtqwidget_

    QWidget是所有用户界面对象的基类,而QtQWidget则是Qt库中的一个关键部分,它封装了与Windows系统底层交互的细节。本文将深入探讨QWidgets和QtQWidget在QT框架中的作用、实现方法以及相关的编程知识点。 首先,...

    QWidget 显示图片,支持缩放、拖动、右键菜单等功能

    在Qt框架中,`QWidget` 是一个基础的用户界面组件,可以用来构建各种复杂的图形用户界面。本示例中,我们关注的是一个扩展了`QWidget` 的类,它增加了显示图片、支持缩放、拖动以及右键菜单的功能。这个自定义的组件...

    026 QWidget类分析显示和隐藏接口说明线程类QThread使用方法.7z

    在Qt库中,`QWidget`类是所有用户界面对象的基础,它是构建图形用户界面(GUI)的核心组件。这个压缩包文件“026 QWidget类分析显示和隐藏接口说明线程类QThread使用方法”显然是针对Qt开发者的,旨在详细解释`...

Global site tag (gtag.js) - Google Analytics