Qt MDI与Splash介绍

news2024/11/20 8:30:17

目录

QMdiSubWindow

子窗口处理

API

QMdiArea

API

QSplashScreen


QMdiSubWindow

QMdiSubWindow 表示 QMdiArea 中的顶层窗口,由带有窗口装饰的标题栏、内部小部件以及(取决于当前样式)窗口框架和大小控制柄组成。QMdiSubWindow 有自己的布局,由标题栏和内部小部件的中心区域组成。

构造 QMdiSubWindow 的最常见方法是调用 QMdiArea::addSubWindow(),并将内部小部件作为参数。您还可以自己创建子窗口,并通过调用 setWidget() 设置内部小部件。使用子窗口编程时,您可以使用与常规顶层窗口相同的 API(例如,您可以调用 show()、hide()、showMaximized() 和 setWindowTitle() 等函数)。

子窗口处理

QMdiSubWindow 还支持特定于 MDI 区域中子窗口的行为。默认情况下,每个 QMdiSubWindow 在移动时在 MDI 区域视口内可见,但也可以指定透明窗口移动和调整大小行为,在这些操作期间仅更新子窗口的轮廓。setOption() 函数用于启用此行为。isShaded() 函数检测子窗口当前是否处于阴影状态(即,窗口折叠,因此只有标题栏可见)。要进入阴影模式,请调用 showShaded()。每当窗口状态发生变化时(例如,当窗口最小化或恢复时),QMdiSubWindow 都会发出 windowStateChanged() 信号。它还会在激活之前发出 aboutToActivate()。

在键盘交互模式下,窗口使用键盘移动和调整大小。您可以通过窗口的系统菜单进入此模式。 keyboardSingleStep 和 keyboardPageStep 属性控制小部件在每次按键事件中移动或调整大小的距离。按下 shift 时,使用向下翻页步进;否则使用单步。您还可以使用键盘更改活动窗口。通过同时按下 control 和 tab 键,将激活下一个(使用当前 WindowOrder)子窗口。通过按下 control、shift 和 tab,您将激活上一个窗口。这相当于调用 activateNextSubWindow() 和 activatePreviousSubWindow()。请注意,这些快捷键会覆盖全局快捷键,但不会覆盖 QMdiAreas 快捷键。

API

分类成员/方法说明
Public Typesenum SubWindowOption { RubberBandResize, RubberBandMove }枚举类型,定义了窗口的选项:可调整大小或可移动。
flags SubWindowOptions用于标记选项的标志类型。
PropertieskeyboardPageStep : int定义页面滚动步长。
keyboardSingleStep : int定义单步滚动步长。
Public FunctionsQMdiSubWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())构造函数,初始化一个 QMdiSubWindow 实例。
virtual ~QMdiSubWindow()析构函数,销毁 QMdiSubWindow 实例。
bool isShaded() const返回窗口是否已被遮蔽(最小化)状态。
int keyboardPageStep() const获取页面滚动步长的值。
int keyboardSingleStep() const获取单步滚动步长的值。
QMdiArea *mdiArea() const获取关联的 QMdiArea 对象。
void setKeyboardPageStep(int step)设置页面滚动步长的值。
void setKeyboardSingleStep(int step)设置单步滚动步长的值。
void setOption(QMdiSubWindow::SubWindowOption option, bool on = true)设置窗口选项。
void setSystemMenu(QMenu *systemMenu)设置窗口的系统菜单。
void setWidget(QWidget *widget)设置窗口中显示的小部件。
QMenu *systemMenu() const获取系统菜单。
bool testOption(QMdiSubWindow::SubWindowOption option) const测试窗口选项是否被启用。
QWidget *widget() const获取窗口中显示的小部件。
Reimplemented Public Functionsvirtual QSize minimumSizeHint() const override重写,返回窗口的最小尺寸建议值。
virtual QSize sizeHint() const override重写,返回窗口的尺寸建议值。
Public Slotsvoid showShaded()显示遮蔽状态(最小化窗口)。
void showSystemMenu()显示系统菜单。
Signalsvoid aboutToActivate()信号:窗口即将激活。
void windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState)信号:窗口状态变化。
Reimplemented Protected Functionsvirtual void changeEvent(QEvent *changeEvent) override重写,处理窗口状态变化的事件。
virtual void childEvent(QChildEvent *childEvent) override重写,处理子窗口事件。
virtual void closeEvent(QCloseEvent *closeEvent) override重写,处理窗口关闭事件。
virtual void contextMenuEvent(QContextMenuEvent *contextMenuEvent) override重写,处理右键菜单事件。
virtual bool event(QEvent *event) override重写,处理窗口事件。
virtual bool eventFilter(QObject *object, QEvent *event) override重写,事件过滤器。
virtual void focusInEvent(QFocusEvent *focusInEvent) override重写,处理窗口获得焦点事件。
virtual void focusOutEvent(QFocusEvent *focusOutEvent) override重写,处理窗口失去焦点事件。
virtual void hideEvent(QHideEvent *hideEvent) override重写,处理窗口隐藏事件。
virtual void keyPressEvent(QKeyEvent *keyEvent) override重写,处理键盘按下事件。
virtual void leaveEvent(QEvent *leaveEvent) override重写,处理鼠标离开窗口事件。
virtual void mouseDoubleClickEvent(QMouseEvent *mouseEvent) override重写,处理鼠标双击事件。
virtual void mouseMoveEvent(QMouseEvent *mouseEvent) override重写,处理鼠标移动事件。
virtual void mousePressEvent(QMouseEvent *mouseEvent) override重写,处理鼠标按下事件。
virtual void mouseReleaseEvent(QMouseEvent *mouseEvent) override重写,处理鼠标释放事件。
virtual void moveEvent(QMoveEvent *moveEvent) override重写,处理窗口移动事件。
virtual void paintEvent(QPaintEvent *paintEvent) override重写,处理窗口绘制事件。
virtual void resizeEvent(QResizeEvent *resizeEvent) override重写,处理窗口大小调整事件。
virtual void showEvent(QShowEvent *showEvent) override重写,处理窗口显示事件。
virtual void timerEvent(QTimerEvent *timerEvent) override重写,处理定时器事件。

QMdiArea

QMdiArea 的功能本质上类似于 MDI 窗口的窗口管理器。例如,它在自身上绘制它所管理的窗口,并以层叠或平铺模式排列它们。QMdiArea 通常用作 QMainWindow 中的中心窗口小部件来创建 MDI 应用程序,但也可以放置在任何布局中。以下代码将一个区域添加到主窗口:

QMainWindow *mainWindow = new QMainWindow;
mainWindow->setCentralWidget(mdiArea);

与顶层窗口的窗口管理器不同,只要当前窗口小部件样式支持所有窗口标志 (Qt::WindowFlags),QMdiArea 便支持这些标志。如果样式不支持特定标志(例如 WindowShadeButtonHint),您仍然可以使用 showShaded() 为窗口着色。

QMdiArea 中的子窗口是 QMdiSubWindow 的实例。它们通过 addSubWindow() 添加到 MDI 区域。通常将设置为内部窗口小部件的 QWidget 传递给此函数,但也可以直接传递 QMdiSubWindow。该类继承 QWidget,编程时可以使用与普通顶层窗口相同的 API。QMdiSubWindow 还具有特定于 MDI 窗口的行为。有关更多详细信息,请参阅 QMdiSubWindow 类描述。

当子窗口获得键盘焦点或调用 setFocus() 时,子窗口变为活动窗口。用户通过以通常的方式移动焦点来激活窗口。当活动窗口发生变化时,MDI 区域会发出 subWindowActivated() 信号,activeSubWindow() 函数返回活动子窗口。

便利函数 subWindowList() 返回所有子窗口的列表。例如,此信息可用于包含窗口列表的弹出菜单。

子窗口按当前 WindowOrder 排序。这用于 subWindowList() 以及 activateNextSubWindow() 和 activatePreviousSubWindow()。此外,它还用于使用 cascadeSubWindows() 和 tileSubWindows() 级联或平铺窗口。

QMdiArea 为子窗口提供了两种内置布局策略:cascadeSubWindows() 和 tileSubWindows()。两者都是插槽,可轻松连接到菜单项。

API

类别成员/函数说明
Public Typesenum AreaOption { DontMaximizeSubWindowOnActivation }枚举类型,定义区域选项:激活子窗口时不最大化。
flags AreaOptions区域选项的标志类型。
enum ViewMode { SubWindowView, TabbedView }视图模式的枚举类型:子窗口视图或标签视图。
enum WindowOrder { CreationOrder, StackingOrder, ActivationHistoryOrder }窗口顺序的枚举类型:创建顺序、堆叠顺序或激活历史顺序。
PropertiesactivationOrder : WindowOrder获取或设置窗口的激活顺序。
background : QBrush获取或设置背景刷子。
documentMode : bool获取或设置是否启用文档模式。
tabPosition : QTabWidget::TabPosition获取或设置标签的位置。
tabShape : QTabWidget::TabShape获取或设置标签的形状。
tabsClosable : bool获取或设置标签是否可关闭。
tabsMovable : bool获取或设置标签是否可移动。
viewMode : ViewMode获取或设置视图模式。
Public FunctionsQMdiArea(QWidget *parent = nullptr)构造函数,初始化 QMdiArea 实例。
virtual ~QMdiArea()析构函数,销毁 QMdiArea 实例。
QMdiArea::WindowOrder activationOrder() const获取当前的窗口激活顺序。
QMdiSubWindow *activeSubWindow() const获取当前激活的子窗口。
QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())添加子窗口,并返回该子窗口对象。
QBrush background() const获取当前背景刷子的值。
QMdiSubWindow *currentSubWindow() const获取当前的子窗口。
bool documentMode() const获取当前是否处于文档模式。
void removeSubWindow(QWidget *widget)移除指定的子窗口。
void setActivationOrder(QMdiArea::WindowOrder order)设置窗口的激活顺序。
void setBackground(const QBrush &background)设置背景刷子。
void setDocumentMode(bool enabled)设置是否启用文档模式。
void setOption(QMdiArea::AreaOption option, bool on = true)设置区域选项。
void setTabPosition(QTabWidget::TabPosition position)设置标签的位置。
void setTabShape(QTabWidget::TabShape shape)设置标签的形状。
void setTabsClosable(bool closable)设置标签是否可关闭。
void setTabsMovable(bool movable)设置标签是否可移动。
void setViewMode(QMdiArea::ViewMode mode)设置视图模式。
QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order = CreationOrder) const获取子窗口列表,按指定顺序排列。
QTabWidget::TabPosition tabPosition() const获取标签位置。
QTabWidget::TabShape tabShape() const获取标签形状。
bool tabsClosable() const获取标签是否可关闭。
bool tabsMovable() const获取标签是否可移动。
bool testOption(QMdiArea::AreaOption option) const测试指定的区域选项是否启用。
QMdiArea::ViewMode viewMode() const获取视图模式。
Reimplemented Public Functionsvirtual QSize minimumSizeHint() const override重写,返回最小尺寸提示。
virtual QSize sizeHint() const override重写,返回建议的尺寸。
Public Slotsvoid activateNextSubWindow()激活下一个子窗口。
void activatePreviousSubWindow()激活上一个子窗口。
void cascadeSubWindows()子窗口层叠显示。
void closeActiveSubWindow()关闭当前激活的子窗口。
void closeAllSubWindows()关闭所有子窗口。
void setActiveSubWindow(QMdiSubWindow *window)设置指定的子窗口为当前激活窗口。
void tileSubWindows()子窗口平铺显示。
Signalsvoid subWindowActivated(QMdiSubWindow *window)信号:当某个子窗口被激活时发出。
Reimplemented Protected Functionsvirtual void childEvent(QChildEvent *childEvent) override重写,处理子窗口事件。
virtual bool event(QEvent *event) override重写,处理事件。
virtual bool eventFilter(QObject *object, QEvent *event) override重写,事件过滤器。
virtual void paintEvent(QPaintEvent *paintEvent) override重写,处理绘制事件。
virtual void resizeEvent(QResizeEvent *resizeEvent) override重写,处理尺寸调整事件。
virtual void scrollContentsBy(int dx, int dy) override重写,处理内容滚动事件。
virtual void showEvent(QShowEvent *showEvent) override重写,处理显示事件。
virtual void timerEvent(QTimerEvent *timerEvent) override重写,处理定时器事件。
virtual bool viewportEvent(QEvent *event) override重写,处理视口事件。
Protected Slotsvirtual void setupViewport(QWidget *viewport) override重写,设置视口。

QSplashScreen

启动画面是通常在应用程序启动时显示的小部件。启动画面通常用于启动时间较长的应用程序(例如需要时间建立连接的数据库或网络应用程序),以向用户提供应用程序正在加载的反馈。

启动画面出现在屏幕中央。如果您想让启动画面小部件保持在桌面上所有其他窗口之上,将 Qt::WindowStaysOnTopHint 添加到启动画面小部件的窗口标志可能会很有用。

某些 X11 窗口管理器不支持“保持在最上面”标志。解决方案是设置一个计时器,定期在启动画面上调用 raise() 来模拟“保持在最上面”效果。

最常见的用法是在屏幕上显示主小部件之前显示启动画面。以下代码片段说明了这一点,其中显示了启动画面,并在显示应用程序的主窗口之前执行了一些初始化任务:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPixmap pixmap(":/splash.png");
    QSplashScreen splash(pixmap);
    splash.show();
    app.processEvents();
    ...
    QMainWindow window;
    window.show();
    splash.finish(&window);
    return app.exec();
}

用户可以通过使用鼠标单击来隐藏启动画面。要使鼠标处理正常工作,请在启动期间定期调用 QApplication::processEvents()。

有时使用消息更新启动画面很有用,例如,在应用程序启动时宣布已建立连接或已加载模块:

QPixmap pixmap(":/splash.png");
QSplashScreen *splash = new QSplashScreen(pixmap);
splash->show();
... // 加载一些项目
splash->showMessage("Loaded modules");
QCoreApplication::processEvents();
... // 建立连接
splash->showMessage("Established connections");
QCoreApplication::processEvents();

QSplashScreen 通过 showMessage() 函数支持此功能。如果您希望自己进行绘制,可以使用 pixmap() 获取启动画面中使用的像素图的指针。或者,您可以子类化 QSplashScreen 并重新实现 drawContents()。

如果有多个屏幕,也可以在主屏幕以外的其他屏幕上显示启动画面。例如:

QScreen *screen = QGuiApplication::screens().at(1);
QPixmap pixmap(":/splash.png");
QSplashScreen splash(screen,pixmap);
splash.show();
类别成员/函数说明
Public FunctionsQSplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())构造函数,使用指定的图片和窗口标志初始化。
QSplashScreen(QScreen *screen, const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags())构造函数,使用指定的屏幕、图片和窗口标志初始化。
virtual ~QSplashScreen()析构函数,销毁 QSplashScreen 实例。
void finish(QWidget *mainWin)显示完成,通常在主窗口显示时调用。
QString message() const获取当前显示的消息文本。
const QPixmap pixmap() const获取当前显示的图片。
void repaint()重新绘制 splash 屏幕。
void setPixmap(const QPixmap &pixmap)设置要显示的图片。
Public Slotsvoid clearMessage()清除当前显示的消息。
void showMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black)显示指定的消息文本,并设置对齐方式和颜色。
Signalsvoid messageChanged(const QString &message)信号:当显示的消息内容发生变化时发出。
Protected Functionsvirtual void drawContents(QPainter *painter)重写,绘制 splash 屏幕内容。
Reimplemented Protected Functionsvirtual bool event(QEvent *e) override重写,处理事件。
virtual void mousePressEvent(QMouseEvent *) override重写,处理鼠标按下事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国家工信安全中心:公共数据授权运营平台技术要求(附下载)

2023年11月23日&#xff0c;第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;浙江省委常委、常务副省长徐文光出席会议并致辞。会上&#xff0c;国家工业信息安全发展研究中心&#xff08;以下简称…

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…

【ArcGISPro】地理配准-影像校正

由于大部分数据安全性&#xff0c;以下是随意下载的图片&#xff0c;仅展示配置操作 地图-地理配准 添加控制点 修改控制点 可以导入、导出、添加和删除控制点 保存 关闭地理配准

ReNamer Pro 7.5 中文绿色便携专业版-文件重命名工具

前言 我们日常生活和工作中所涉及的文件数量日益增多。无论是图片、音频、视频还是各种文档&#xff0c;这些文件在存储、管理和分享时&#xff0c;都需要有一个清晰、有序的文件命名规则。然而&#xff0c;手动重命名大量文件不仅耗时耗力&#xff0c;而且容易出错&#xff0c…

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写&#xff0c;也就是说程序在执行的时候生成可以执行的代码&#xff0c;然后执行它。在介绍JIT之前&#xff0c;需要说下两种执行方式&#xff1a;解释执行和编译执行。其中解释执行是通过解释器&#xff0c;将代码逐…

力扣-Hot100-数组【算法学习day.37】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…

BERT--公认的里程碑

前言 如果说&#xff0c;让我选Transformer架构的哪个模型最深入人心&#xff0c;我将毫不犹豫的选择BERT&#xff01; BERT 的意义在于&#xff0c;从大量无标记的数据集中训练得到的深度模型&#xff0c;可以限制提高各项自然语言处理任务的准确率。 BERT 在当时&#xff0…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…

果韵 2.0.1| 听歌神器,双端支持,支持下载歌曲和歌词

果韵是一款支持Windows和安卓双端的音乐播放器&#xff0c;支持自定义音源&#xff0c;界面简洁。用户可以通过缓存下载歌曲和歌词。为了使用这些功能&#xff0c;需要先进行音源导入。通过设置中的存储设置&#xff0c;将缓存文件夹移动到download目录下&#xff0c;之后缓存的…

Allegro从.brd文件中导出器件ball map

Step 1&#xff08;可选&#xff09;&#xff1a;设置网络颜色 Step2&#xff1a;File->Export->Symbol Spreadsheet\ Step3&#xff1a;Primary text选择Net Name Step 4&#xff1a;在.brd所有文件夹下生成一个ball map文件&#xff0c;其中网络颜色与Step 1一致。ba…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

elasticsearch的倒排索引是什么?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch的倒排索引是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch的倒排索引是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 倒排索引&#xff08;Inverted Index&a…