思路:

QTabWidget的特点:点击不同的选项卡显示不同的窗口。可以将QTabWidget分成两部分:

  (1).选项卡:点击时要知道点击的是哪个选项。则需要将选项卡和窗口的信息存起来,点击时去这个信息中判断;

  (2).窗口:点击某个选项卡时,相应的窗口显示,其他窗口隐藏,可以将这些窗口全部放到一个布局中。

(1)创建一个结构体,包含选项卡和窗口的信息:

struct TabWidgetItem {
  QString id; //每项的id
  QWidget* window; //窗口
  IconButton* icon; //选项卡
  int status; //0选中; 1选中
}; QList<TabWidgetItem*> m_pTabWidgetList; //存放整个TabWidget(选项卡和窗口所有信息)信息的list列表
 

(2)初始化布局和结构体

void TabWidget::initLayout()
{
  QHBoxLayout* pMainLayout = new QHBoxLayout(this);
  pMainLayout->setMargin();
  pMainLayout->setSpacing();   QVBoxLayout* pIconLayout = new QVBoxLayout();
  QVBoxLayout* pWindowLayout = new QVBoxLayout();   pMainLayout->addLayout(pWindowLayout);
  pMainLayout->addLayout(pIconLayout);
} void TabWidget::initTabWidgetItemData()
{
  {
    TabWidgetItem* pItem = new TabWidgetItem;
    pItem->id = "real";     QWidget* pBaseWidget = new QWidget(this);
    pItem->window = pBaseWidget;
    pItem->window->setVisible(false);
    pWindowLayout->addWidget(pItem->window); pItem->icon = new IconButton("实时视频", this);
pIconLayout->addWidget(pItem->icon);
connect(pItem->icon, SIGNAL(clicked(IconButton*)), this, SLOT(sltMenuClicked(IconButton*))); pItem->status = false;
m_pTabWidgetList.append(pItem);
  }   {
    TabWidgetItem* pItem = new TabWidgetItem;
    pItem->id = "local";     QWidget* pBaseWidget = new QWidget(this);
    pItem->window = pBaseWidget;
    pItem->window->setVisible(false);
    pWindowLayout->addWidget(pItem->window); pItem->icon = new IconButton("本地回放", this);
pIconLayout->addWidget(pItem->icon);
connect(pItem->icon, SIGNAL(clicked(IconButton*)), this, SLOT(sltMenuClicked(IconButton*))); pItem->status = false;
m_pTabWidgetList.append(pItem);
  }
}
(3)自定义选项卡IconButton类
IconButton.h文件

#pragma once

#include <QWidget>

class IconButton: public QWidget
{
Q_OBJECT
public:
explicit IconButton(QString title, QWidget *parent = );
~IconButton(); private:
QLabel* m_pTitle;
private:
void initLayout();
public:
void setTitle(QString title);
protected:
void mouseReleaseEvent(QMouseEvent *event);
signals:
void clicked();
signals:
void clicked(IconButton*);
} IconButton.cpp文件
#include "IconButton.h"
IconButton::IconButton(QString title, QWidget *parent)
: QWidget(parent)
{
initLayout();
setTitle(title);
} void IconButton::initLayout()
{
m_pMainLayout = new QHBoxLayout(this); m_pTitle = new QLabel(this);
m_pTitle->setStyleSheet("QLabel{font-size:15px;font-weight:100;color:white;}");
m_pMainLayout->addWidget(m_pTitle, , Qt::AlignLeft);
} void IconButton::setTitle(QString title)
{
m_pTitle->setText(title);
} void IconButton::mouseReleaseEvent(QMouseEvent *event)
{
if (Qt::LeftButton == event->button())
{
/* 只处理鼠标在按钮区域弹起 */
if (this->rect().contains(event->pos()))
{
/* 单击 */
emit clicked();
emit clicked(this); //关键:单击返回this指针
}
}
}

(4)设置切换函数

void TabWidget::setTabWidgetActivePage(QString id)
{
QWidget* pNextwindow = NULL;
for (int i = ; i < m_pTabWidgetList.size(); i++) { //先将所有窗口隐藏
TabWidgetItem* item = m_pTabWidgetList.at(i);
item->status = ;
item->icon->setChekced(false);
item->window->hide();
if (item->id == id) {
item->status = ;
item->icon->setChekced(true);
pNextwindow = item->window;
}
}
if (pNextwindow) {
pNextwindow->show(); //再显示选择的窗口
}
} void TabWidget::sltMenuClicked(IconButton * btn)
{
for (int i = ; i < m_pTabWidgetList.size(); i++) {
TabWidgetItem* item = m_pTabWidgetList.at(i);
if (item->icon == btn) {
setTabWidgetActivePage(item->id);
break;
}
}
} TabWidget::TabWidget(QWidget *parent)
{
initTabWidgetData();
setTabWidgetActivePage("real");
}
 
(5)大功告成
 
我只是把核心代码写下来了,别的花里胡哨的添加自己写...
 
 
 

Qt 自定义QTabWidget的更多相关文章

  1. paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

  2. QSet使用及Qt自定义类型使用QHash等算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法     本文地址:http://techie ...

  3. Qt自定义插件编程小结

    qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...

  4. Qt自定义标题栏

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt自定义标题栏     本文地址:http://techieliang.com/2017/1 ...

  5. Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  6. Qt 自定义事件

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  7. Qt自定义事件的实现(转)

    原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...

  8. Qt 自定义 滚动条 样式

    今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...

  9. QT自定义精美换肤界面

    陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数次,一直搜索QT相关的换 ...

随机推荐

  1. WebSocket 实现前后端通信的笔记

    之前在做站内信时,用到了 WebSocket ,整理了一些笔记分享如下.本文基于 SpringBoot 2.1.5,本文不涉及环境搭建. 引入依赖 在 Spring 中要使用 WebSocket 功能 ...

  2. GoCN每日新闻(2019-10-03)

    GoCN每日新闻(2019-10-03) 国庆专辑:GopherChina祝大家国庆节快乐 GoCN每日新闻(2019-10-03) 1. 垃圾回收器如何监控你的应用程序 https://medium ...

  3. 【0521模拟赛】小Z爱划水

    题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...

  4. ICEM-空心圆柱体

    原视频下载地址:https://pan.baidu.com/s/1boG49MB 密码: 4iq6

  5. 四个大点,搞懂 Redis 到底快在哪里

    来源:https://mp.weixin.qq.com/s/4kPlBE3C6lTuSvt5mY5hUQ 前言 一. 开发语言 二. 纯内存访问 三. 单线程 四. 非阻塞多路I/O复用机制 前言 R ...

  6. $(window).load()方法的使用场景

    一.$(window).load().window.onload=function(){}和$(document).ready()方法的区别 1.$(window).load() 和window.on ...

  7. Compute API 关键概念 详解

    Compute API 是 RESTful HTTP 服务,提供管理虚机的能力. 虚机可能有不同的内存大小,CPU数量,硬盘大小,能够在几分钟之内创建出来.和虚机的交互,可以通过Compute API ...

  8. 解决idea创建Maven项目速度慢

    idea在创建maven项目的时候会去网上自动下载需要的插件,这样就会导致项目创建后一直处于下载插件的状态中,影响开发效率 此时我们可以在创建maven骨架的时候,加入键值对来让maven调用本地的骨 ...

  9. protobuf使用

    一.protobuf环境搭建 Github 地址: https://github.com/protocolbuffers/protobuf 然后进入下载页 https://github.com/pro ...

  10. Nginx Windows版安装及域名绑定

    1.到 http://nginx.org/en/download.html 下载一个稳定版本1.16.1 2.解压,放到C盘根目录下,如C:\nginx-1.16.1,此时双击nginx.exe就启动 ...