QT 多层视图(视图叠加显示)

这篇具有很好参考价值的文章主要介绍了QT 多层视图(视图叠加显示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前做Mac应用开发,视图层是可以上下叠加显示的,然后回到QT这边开发,发现QT的布局上不能叠加显示,于是写了个简单的可以叠加QWidget的小Demo

这是调用的代码:

#include "mainform.h"
#include "multilayoutwidget.h"

#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>

MainForm::MainForm(QWidget *parent)
    : QWidget(parent)
{
    MultiLayoutWidget *multiWidget = new MultiLayoutWidget(this);

    QVBoxLayout *vlayout1 = new QVBoxLayout;
    QLabel *label1 = new QLabel("AAAAAAAA");
    QLabel *label2 = new QLabel("BBBBBBBBBB");
    vlayout1->addWidget(label1);
    vlayout1->addWidget(label2);
    multiWidget->setLayout(vlayout1);

    QWidget *grayWidget = new QWidget;
    QVBoxLayout *vLayout2 = new QVBoxLayout;
    grayWidget->setLayout(vLayout2);
    multiWidget->addWidget(grayWidget);
    grayWidget->setStyleSheet("QWidget { background-color:rgba(150, 150, 150, 200); }");

    QLabel *label3 = new QLabel("CCCC");
    multiWidget->addWidget(label3);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(multiWidget);
    this->setLayout(mainLayout);
}


效果:

可以看出AAAAAA和BBBBB在最底层,中间层是一个半透明的灰色层,最上面层显示CCCCC。

AAAAAA和BBBBB被中间层遮盖,看起看没那清晰,最上面一层的CCCCC则非常清晰。

QT 多层视图(视图叠加显示)

控件源码:

MultiLayoutWidget.h

#ifndef MULTILAYOUTWDGET_H
#define MULTILAYOUTWDGET_H

#include <QFrame>
#include <QEvent>

class MultiLayoutWidgetPrivate;
class MultiLayoutWidget : public QFrame
{
    Q_OBJECT
public:
    explicit MultiLayoutWidget(QWidget *parent = nullptr);

    /**
     * @brief 主层设置布局
     */
    void setLayout(QLayout*);

    /**
     * @brief 增加一层视图
     */
    void addWidget(QWidget*);

    /**
     * @brief 插入一层视图
     */
    void insertWidget(int index, QWidget*);

    /**
     * @brief 获取视图
     */
    QWidget *widget(int index);

    /**
     * @brief 删除视图层
     */
    void removeWidget(QWidget *);
    void removeWidget(int index);

    /**
     * @brief 该层是否获取鼠标事件,默认只有最顶层获取鼠标事件
     * @attention 该功能还没实现,后续有时间再更新
     */
    void widgetSetMouseEvent(QWidget*, bool state);
    void widgetSetMouseEvent(int index, bool state);

protected:
    bool event(QEvent*) override;

private:
    std::unique_ptr<MultiLayoutWidgetPrivate> d;
};

#endif // MULTILAYOUTWDGET_H

 MultiLayoutWidget.cpp

#include "multilayoutwidget.h"

#include <QList>

class MultiLayoutWidgetPrivate {
public:
    QWidget *mainWidget;
    QList<QWidget*> widgetList;
};

MultiLayoutWidget::MultiLayoutWidget(QWidget *parent)
    : QFrame{parent}
{
    d = std::make_unique<MultiLayoutWidgetPrivate>();
    d->mainWidget = new QWidget(this);
    d->mainWidget->raise();
}

void MultiLayoutWidget::setLayout(QLayout *layout)
{
    d->mainWidget->setLayout(layout);
}

void MultiLayoutWidget::addWidget(QWidget *widget)
{
    if(!widget) return;
    widget->setParent(this);
    d->widgetList.append(widget);
    widget->setGeometry(this->contentsRect());
    widget->raise();
}

void MultiLayoutWidget::insertWidget(int index, QWidget *widget)
{
    if(!widget) return;
    if(index > d->widgetList.size())
        index = d->widgetList.size();
    widget->setParent(this);
    d->widgetList.insert(index, widget);
    widget->setGeometry(this->contentsRect());
    widget->raise();

    for(int i = index + 1; i < d->widgetList.size(); ++i) {
        d->widgetList[i]->raise();
    }
}

QWidget *MultiLayoutWidget::widget(int index)
{
    if(index > d->widgetList.size())
        return nullptr;
    return d->widgetList[index];
}

void MultiLayoutWidget::removeWidget(QWidget *widget)
{
    if(d->widgetList.removeOne(widget)) {
        widget->deleteLater();
    }
}

void MultiLayoutWidget::removeWidget(int index)
{
    if(index < d->widgetList.size()) {
        QWidget *widget = d->widgetList[index];
        d->widgetList.removeAt(index);
        widget->deleteLater();
    }
}

void MultiLayoutWidget::widgetSetMouseEvent(QWidget *, bool state)
{

}

void MultiLayoutWidget::widgetSetMouseEvent(int index, bool state)
{

}

bool MultiLayoutWidget::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::Resize:
        d->mainWidget->setGeometry(this->contentsRect());
        foreach (QWidget *widget, d->widgetList) {
            widget->setGeometry((this->contentsRect()));
        }
        break;
    default:
        break;
    }

    return QWidget::event(e);
}

如果觉得对你有用,请点个赞。

补充

哈哈哈,后面发现使用QStackedLayout::setStackingMode(QStackedLayout::StackAll)也能达到同样的效果。文章来源地址https://www.toymoban.com/news/detail-505236.html

到了这里,关于QT 多层视图(视图叠加显示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt应用开发常用功能

    先使Linux的普通用户可以在不输入密码的情况下,执行sudo reboot命令实现重启。 第一种关机方法 第二种关机方法 重启指令:shutdown -r -t xx 注销指令:shutdown -l -t xx 在Qt程序中,我们有时候会遇到这样的需求,比如让程序暂停(休息、休眠)一段时间。这里介绍以下几种方法:

    2023年04月25日
    浏览(83)
  • Qt应用开发(基础篇)——QComboBox

             QComboBox下拉框继承于QWidget,作为Qt Wdiget常用的控件,在实际开发中,经常用来作为某些特定参数属性的选择,比如 语言 、 国家 、 字体 、 主题 、 模式 、 串口号 、 波特率 等选择性已知需要下拉的场景。而QFontComboBox字体下拉框继承于QComboBox,是一个封装专门

    2024年02月15日
    浏览(52)
  • Qt应用开发——QLabel的使用

            QLabel标签继承于QFrame,QFrame继承于QWidget,是Qt中最基础也是最常用的控件。         框架类QFrame介绍         QLabel不提供用户交互功能,标签的视觉外观可以通过多种方式进行配置,并且可以使用它为其他界面的标签,QLabel可以用来显示以下这些内容: 纯文本

    2024年02月17日
    浏览(50)
  • 《Qt开发》MDI应用程序

    实现多个子窗体的自定义布局(自定义子窗体尺寸和位置)、平铺布局(titleSubWindows)和分页模式(QMdi::TabbedView)。 运行效果图 初始布局(自定义布局) 平铺布局 多页模式 实现过程 1. 创建项目MdiFirstDemo,并创建3个子窗体,分别为FirstSubWindow、SecondSubWindow和ThirdSubWindow。

    2024年01月16日
    浏览(51)
  • Qt应用开发——下载安装和HelloWorld

            工欲善其事,必先利其器。第一步环境安装好是必要的过程。Qt 在23年4月份已经更新到了6.5.0,相对于其他的工具,Qt不断在维护升级这一点就非常的友好,这里对版本的迭代更新内容不做介绍,做应用开发的话肯定是版本越新最好。官网下载的每个版本都提供了

    2024年02月16日
    浏览(49)
  • Qt应用开发(安卓篇)——Hello Qt On Android

            这一篇从实际出发,讲述如何创建、编译和部署Qt On Android项目。          ADB 的全称为Android Debug Bridge,就是起到调试桥的作用,主要用于连接计算机与 Android 设备,以便进行调试和数据传输。ADB 可以实现以下主要用途: 设备管理:允许用户连接和管理多个设

    2024年01月23日
    浏览(44)
  • VS下开发Qt应用环境搭建

    vs2019 QT5.14 我之前是按照QT基础组件的安装,但是这个安装只是最基础的组件,如果想要在VS中使用QT,还得安装其他组件,下面的安装流程、 我之前已经安装了QT,现在需要新增套件 Qt安装完毕后,如何再添加移除组件 运行MaintenanceTool.exe QT 此操作至少需要一个处于启用状态

    2024年02月14日
    浏览(49)
  • QT客户端开发的应用场景

    QT 是一跨平台应用程序开发框架,支持多种操作系统,包括 Windows、macOS、Linux、Android、iOS 和嵌入式系统等。这使得 QT 非常适合开发需要在多种平台上运行的应用程序。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 QT 提供了一套完整的开发工具和

    2024年04月29日
    浏览(42)
  • CMake+QT+大漠插件的桌面应用开发

    在CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件中已经说明了如何免注册调用大漠插件,以及做了几个简单的功能调用(查找窗口、截图) 下面来利用 QT 和 大漠插件 做一个简单的窗口查找、截图的桌面工具应用,功能点如下 点击“注册”选项完成大漠插件

    2024年01月19日
    浏览(49)
  • Qt应用开发(基础篇)——进度条 QProgressBar

             QProgressBar 类继承于QWidget,是一个提供了横向或者纵向进度条的小部件。           QProgressBar 进度条一般用来显示用户某操作的进度,比如 烧录、导入、导出、下发、上传、加载 等这些需要耗时和分包的概念,让用户知道程序还在正常的执行中。       

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包