Qt 自定义QTabWidget
思路:
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);
}
}
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");
}
Qt 自定义QTabWidget的更多相关文章
- paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制
源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...
- QSet使用及Qt自定义类型使用QHash等算法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法 本文地址:http://techie ...
- Qt自定义插件编程小结
qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...
- Qt自定义标题栏
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt自定义标题栏 本文地址:http://techieliang.com/2017/1 ...
- Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...
- Qt 自定义事件
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...
- Qt自定义事件的实现(转)
原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...
- Qt 自定义 滚动条 样式
今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...
- QT自定义精美换肤界面
陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数次,一直搜索QT相关的换 ...
随机推荐
- Java web开发——文件夹的上传和下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- 使用terraform 生成自签名证书
terraform 是一个很不错的基础设施工具,我们可以用来做关于基础设施部署的事情,可以实现基础设施即代码 以下演示一个简单的自签名证书的生成(使用tls provider) main.tf 文件 ...
- REdis之maxmemory解读
redis.conf中的maxmemory定义REdis可用最大物理内存,有多种书写方式,以下均为合法: maxmemory 1048576 maxmemory 1048576B maxmemory ...
- 洛谷 P1508 Likecloud-吃、吃、吃 题解
P1508 Likecloud-吃.吃.吃 题目背景 问世间,青春期为何物? 答曰:"甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!" 题目描述 正处在某一特定时期之中的李大水牛由于消化 ...
- SQL基础-更新&删除&视图
一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...
- rancher2.x的安装
docker run -d --restart=unless-stopped \-p 80:80 -p 443:443 \-v /var/lib/rancher:/var/lib/rancher/ ...
- 第06组 Alpha冲刺(4/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- 第12组 Beta冲刺(5/5)
Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...
- 【转】谈谈servlet、spring、struts
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- ubuntu16.04 安装使用meld及问题
本文链接:https://blog.csdn.net/ai_liuliu/article/details/95504095安装meldsudo apt-get install meld启动meld方法 ...