Qt实现小功能之复杂抽屉效果详解

目录
  • 功能讲解
  • 自定义标题widget
    • 标题名称控件的创建
    • QCheckBox控件的创建
  • 自定义内容Widget
    • 创建显示高度描述控件
  • QScrollArea中widget实现
  • QScrollArea子窗口的提升

在Qt自带的控件中,也存在抽屉控件:QToolBar。但是,该控件有个缺点:一次只能展开一个抽屉信息,无法实现多个展开。为此,实现了如下效果的程序:

下面对这种实现效果进行讲解~

功能讲解

开发环境:VS2017 + Qt5.14.2 64位

实现的核心技术:

1:QScrollArea的应用。

2:垂直布局的应用。

根据展示效果可以发现:一个标题下面对应了一个显示窗口,标题的下拉按钮控制了粉色窗口的显示和隐藏。

接下来,由内向外进行实现。

自定义标题widget

类名:QSingleTitleWidget

代表了每一个单独的标题窗口。包含了两个控件:QLabel、QCheckBox,分别展示标题名称以及控制是否展示对应的内容窗口

标题名称控件的创建

QString qsLabelStyle = "QLabel{color:#333333; font-family:Microsoft YaHei UI; font-size:18px;} QLabel{background-color: transparent}";
m_labTitle = new QLabel(this);
m_labTitle->setGeometry(10, 0, 200, 60);
m_labTitle->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
m_labTitle->setStyleSheet(qsLabelStyle);
m_labTitle->show();

QCheckBox控件的创建

QString qsCheckStyle = "QCheckBox{color:#333333;font-family:Microsoft YaHei UI;font-size:14px;}"
"QCheckBox::indicator::checked{image:url(:/QMultipleToolBarWidget/image/jd_zk_s.png)}"
"QCheckBox::indicator::unchecked{image:url(:/QMultipleToolBarWidget/image/jd_sq_n.png)}";
m_check = new QCheckBox(this);
m_check->setGeometry(500, 5, 50, 60);
m_check->setStyleSheet(qsCheckStyle);
connect(m_check, &QCheckBox::clicked, this, &QSingleTitleWidget::OnCheckShowState);
m_check->show();
m_check->setChecked(false);

在标题类(QSingleTitleWidget)中需要实现QCheckBox的响应消息,通知外界该标题类对应的内容类是显示还是隐藏状态。

"setChecked(false)":默认窗口一创建就让粉色窗口处于隐藏状态。

对于QCheckBox的消息的实现,如下:

void QSingleTitleWidget::OnCheckShowState(bool checked /*= false*/)
{
	emit Msg_SendShowState(m_nNum, checked);
}

其中,m_nNum是当前标题窗口的编号,在通知外界的同时也需要告诉外界,是哪个窗口发生了变化!

补充一点:在QSingleTitleWidget类中也可以不实现QCheckBox响应消息,直接使用QWidget::mousePressEvent消息做处理,这里不再详细说明!

自定义内容Widget

类名:QSingleContentWidget

代表了每一个单独的内容窗口。仅有一个控件:QLabel,只是用于提示窗口的高度。

其实在实际开发中,可以展示更丰富的内容,这里只是展示了不同高度。

创建显示高度描述控件

QString qsLabelStyle = "QLabel{color:#333333; font-family:Microsoft YaHei UI; font-size:18px;} QLabel{background-color: transparent}";
m_labContent = new QLabel(this);
m_labContent->setStyleSheet(qsLabelStyle);
m_labContent->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
m_labContent->show();

设置具体的高度值

void QSingleContentWidget::SetContent(int nHeight)
{
	QString qsContent = QStringLiteral("当前窗口高度是:") + QString::number(nHeight);
	m_labContent->setGeometry(10, 10, 540, nHeight-20);
	m_labContent->setText(qsContent);
}

以上1、2两部分内容分别描述了标题widget、内容widget,下面需要创建一个承载这些内容的widget载体,将在QScrollArea中使用。

QScrollArea中widget实现

类名:QScrollAreaWidget

该类是一个承载多个标题、内容的widget,也是直接由外部调用的类。

假设:传入一个std::vector<int>的容器,容器的多少大小代表的是标题的个数,int值是随机生成的高度值。

但是,到了真正业务应用中时,这里的int没准就是一个结构体,或者是一个数据指针,无论是什么,处理方式都是一样的。

对外开放接口:

void QScrollAreaWidget::SetScrollAreaData(std::vector<int> vetWidget)
{
    //数据处理
}

根据vetWidget的大小创建出对应的数据组(一个标题、一个内容)

直接上全部代码~

int nTop = 0;
for (int i = 0; i < vetWidget.size(); i++)
{
	//创建:标题
	QSingleTitleWidget *widgetTitle = new QSingleTitleWidget(this);
	widgetTitle->setFixedSize(560, 60);
	widgetTitle->SetTitleContent(i);
	bool bShowState = i == 0 ? true : false;
	widgetTitle->SetShowState(bShowState);
	widgetTitle->show();
	connect(widgetTitle, &QSingleTitleWidget::Msg_SendShowState, this, &QScrollAreaWidget::MsgReceivedTitleControlShowState);
	m_vetTitleWidget.push_back(widgetTitle);
	m_layout.addWidget(widgetTitle);
	nTop += 60 + 5;

	//创建:内容
	QSingleContentWidget *widgetContent = new QSingleContentWidget(this);
	widgetContent->setFixedSize(QSize(560, vetWidget[i]));
	widgetContent->SetContent(vetWidget[i]);
	if (bShowState == true)
	{
		widgetContent->show();
		nTop += vetWidget[i] + 5;
	}
	else
	{
		widgetContent->hide();
	}
	m_mapContentWidget.insert(std::make_pair(i, widgetContent));
	m_layout.addWidget(widgetContent);

}
m_layout.addStretch(0);
m_layout.setSpacing(5);
this->setLayout(&m_layout);

m_nTotalHeight = nTop;

this->setFixedSize(QSize(560, nTop));

代码讲解:

1:创建标题类:QSingleTitleWidget、创建内容类:QSingleContentWidget。

这两个类是一对一对应的。其中,这里有个小逻辑处理,当编号是0时(也就是第一组数据时)默认处于显示状态。

采用了三目运算符,方便简单:bool bShowState = i == 0 ? true : false;

并且,在创建QSingleContentWidget类时,根据是否显示状态来控件该类是否显示。

2:消息处理

之前在QSingleTitleWidget类中发送了一个QCheckBox的消息,在这里就运用到该消息了。

Msg_SendShowState参数值=true时,代表展示QSingleContentWidget类内容;反之,隐藏QSingleContentWidget类的内容。

3:垂直布局应用

每创建一个新的widget,需要将widget添加到布局中:m_layout.addWidget(widgetTitle);

最后,需要在当前类中绑定布局:this->setLayout(&m_layout);

4:nTop值的意义

每创建一个类都需要对nTop进行追加,主要是为了扩大QScrollArea子窗口widget的大小,其实在使用布局后不使用也没有关系,但是为了能够让我们控制widget的高度,最好主动进行设置。

QScrollArea子窗口的提升

从Qt Designer中拖出来的QScrollArea控件,默认会自带一个widget子控件,上述3下的功能就是对子控件的重写,那么该如何绑定呢?

选中提升后,出现下面页面

红框里面就是需要提升的类文件以及类名。

注意:设置了提升的类名称后,默认头文件会自动添加,但是该头文件是不区分大小写!这里一定要改成与实际的头文件名称保持一致!

刚开始做的时候未区分大小写,结果找了半天才找到原因,这也跟Qt版本有关系,最好与我们提升的类一一对应!

到此这篇关于Qt实现小功能之复杂抽屉效果详解的文章就介绍到这了,更多相关Qt复杂抽屉效果内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt实现栅格布局效果

    Qt提供QGridLayout类来实现栅格布局,所谓栅格,就是网格,拥有规律的行和列,通过QGridLayout可以很方便的对多个控件进行布局. 如果在设计师中进行拖拽绘制,一旦需求有变,需要增加或者删除控件,就被迫打破原来的布局,重新进行调整,这是一件很耗时的事件, 所以通过代码画,还能做到复用,往往是首选. 效果: 代码: #include "mainwindow.h" #include "ui_mainwindow.h"   MainWindow::MainW

  • Qt实现简易毛玻璃效果的示例代码

    目录 现有功能 运行结果 源码 frosted_glass_label.h frosted_glass_label.cpp main.cpp 现有功能 1.用模糊功能实现简易的毛玻璃效果. 2.鼠标移动无边框窗口. 运行结果 源码 frosted_glass_label.h #ifndef FROSTEDGLASSLABEL_H #define FROSTEDGLASSLABEL_H #include <QWidget> #include <QLabel> #include <

  • Qt实现界面滑动切换效果的思路详解

    目录 一.Qt实现界面滑动切换效果 二. 设计思路 三.主要函数讲解 四.源代码解析 4.1 初始化界面 4.2 上一页滑动效果 4.3  下一页滑动效果 4.4 动画结束处理 五.源码地址 一.Qt实现界面滑动切换效果 效果如下图,滑动效果移动上下屏幕. 二. 设计思路 利用QStackWidget将页面存储起来,因为页面比较少,因此我直接将所有的页面存储在QStachWidget中,如果页面相对较多,可以使用使用使渲染的方式. 然后使用show函数同时展示两个页面的内容,这个很重要,如果使用

  • Qt实现小功能之圆形进度条的方法详解

    目录 功能 图形绘制 1.绘制窗口整体背景色值 2.圆形进度条通道绘制 3.圆形进度条绘制 4.文本绘制 数值计算 1.计算步长 2.实时数据计算 在Qt自带的控件中,只有垂直进度条.水平进度条两种. 在平时做页面开发时,有些时候会用到圆形进度条,比如说:下载某个文件的下载进度. 展示效果,如下图所示: 实现这个功能主要由以下几个重点: 1:图形绘制 2:数值计算 也算是一个初级例子,下面我来讲解下如何实现这个简单的小功能吧! 功能 自定义绘制类:QRoundedProgress 继承自QWid

  • Python PyQt4实现QQ抽屉效果

    本文实例为大家分享了Python PyQt4实现QQ抽屉效果展示的具体代码,供大家参考,具体内容如下 先看截图效果: 主要是使用了QT的QTabWidget.QToolBox多页窗口部件 # -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) class

  • Qt实现小功能之复杂抽屉效果详解

    目录 功能讲解 自定义标题widget 标题名称控件的创建 QCheckBox控件的创建 自定义内容Widget 创建显示高度描述控件 QScrollArea中widget实现 QScrollArea子窗口的提升 在Qt自带的控件中,也存在抽屉控件:QToolBar.但是,该控件有个缺点:一次只能展开一个抽屉信息,无法实现多个展开.为此,实现了如下效果的程序: 下面对这种实现效果进行讲解~ 功能讲解 开发环境:VS2017 + Qt5.14.2 64位 实现的核心技术: 1:QScrollAre

  • 微信小程序图片左右摆动效果详解

    先看效果,实现一个图片左右摇动,在一般的H5宣传页,商家活动页面我们会看到这样的动画,小程序的动画效果不同于css3动画效果,是通过js来完成的,其实步骤很简单,首先创建动画实例,再调用实例来描述动画,最后导出即可. 先看效果如下: 简单的参考代码: wxml: <image class='img' src="http://intmote.com/picture/gift.png" animation="{{animation}}"></image

  • Qt自定义Widget实现互斥效果详解

    目录 前沿 功能实现 知识点 问题 讲解知识点1 讲解知识点2 讲解知识点3 总结 前沿 什么叫做自定义Widget实现互斥效果呢? 在使用Qt做一个界面美观性比较强的功能时,可能会遇到这种问题:多个控件互斥,类似于QRadiButton控件,但又不是单纯的QRadioButton控件,互斥的可能是一个窗口,也可能是几个按钮,等等多种情况. 这里我只是列举了一个简单的互斥例子,虽然简单,但是包含了各种坑,有需要的掘友们可以小笔记们记一下,尤其是对Qt新手来说,还是很有必要的. 由效果图可以看出创

  • 微信小程序实现分类菜单激活状态随列表滚动而自动切换效果详解

    目录 view结构 js部分 属性解释 说明 注意 这里主要用到微信小程序提供的SelectorQuery获取页面节点信息实现,组件用的是微信小程序的scroll-view 逻辑就是获取右侧盒子的节点信息,获取右侧子分类的节点信息,当子分类滑动到顶部的之后,则切换左侧分类状态,而且当右侧子分类的位置处于触顶以及包含顶部位置的状态下,同样激活左侧分类状态. view结构 左侧父级分类 <scroll-view class="left" scroll-y > <view

  • 微信小程序 动态传参实例详解

    微信小程序 动态传参实例详解 在微信小程序的开发过程中经常会用到动态传参,比如根据某一页面传参的不同,加载不同的新的页面.接下来介绍下如何实现. 上一篇博客中介绍了如何用wx:for循环显示数组,一般情况下我们要实现的功能是点击不同的元素进入不同的页面,比如在另一个页面加载某个元素的详细信息. 跳转这里采用navigator跳转,在navigator跳转的链接上将参数加上去: index.wxml(根据点击页面的不同传递参数) <view class="item" wx:for=

  • iOS新功能引导提示界面实例详解

    在开发中,现在很多app更新了新功能时都会给出用户一个提示,以方便用户更好的体验,那么这个功能如何实现的呢? 首先看下效果图: 1.首先创建第一个viewcontroller 在上面放上一个imageview和一个按钮 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIImageView *imageview=[[UIImageView alloc]ini

  • js实现图片局部放大效果详解

    图片局部放大效果结合的知识点主要是DOM的操作,以及事件的应用,所以首先要对DOM的操作有一定了解,其次能对事件的应用有一定的累积. 如上图,可以看到,这是放大镜的基本效果,主要分成左右两个部分.左边分成一张大图,和一个导航栏,在右边则是一个放大镜放大后的图片.因此,我在画页面的时候,大体的HTMl结构如下: <body> <div class="choose"> <div class="content"> <img src

  • JavaScript实现六种网页图片轮播效果详解

    目录 1.当鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮. 2.动态生成小圆圈 3.点击小圆圈,小圆圈变色 4.点击小圆圈滚动图片 5.点击右侧按钮一次,就让图片滚动一张. 6.点击右侧按钮, 小圆圈跟随变化 7.左侧按钮功能制作 8.自动播放功能 在网页中,我们经常会看到各种轮播图的效果,它们到底是怎样实现的呢?今天,我们就一起来看一下!首先,我们需要准备若干张图片,在这里我准备了五张图片. 功能需求: 鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮. 点击右侧按钮一次,图片往左播放

  • Qt实现部件透明阴影效果与不规则窗体详解

    目录 透明效果 阴影效果 不规则窗体效果 透明效果 原始效果 设置整个窗体透明,调用setWindowOpacity( )方法,传入一个0~1之间的值来表示透明度:1表示不透明,0表示完全透明 setWindowOpacity(0.5);//0~1之间 设置窗体透明,部件不透明 setWindowFlags(Qt::FramelessWindowHint);//无边框 setAttribute(Qt::WA_TranslucentBackground);//透明 对单个部件设置透明 QGraph

随机推荐