动态增加分栏

本篇模拟Qt代码编辑器中的动态分栏功能,动态创建回收QSplitter

//mainwindow.cpp
MainWindow(){QSplitter *sp = new QSplitter(this);Widget     *w = new Widget(sp);sp->setHandleWidth(1);sp->setChildrenCollapsible(false);sp->addWidget(w);setCentralWidget(sp);resize(600,500);
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QSplitter>
#include <QComboBox>
#include <QStringListModel>
#include <QToolButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QResizeEvent>#define ICONSIZE 20class MyBtn: public QToolButton {public:MyBtn(QString icon,QLayout *layout, QWidget *parent): QToolButton{parent}{setIcon(QIcon(icon)); setAutoRaise(true);setFixedSize(ICONSIZE,ICONSIZE); layout->addWidget(this);}
};class Widget;
class WidgetPrivate: public QWidget{public:explicit WidgetPrivate(QWidget *parent= nullptr);
protected:bool eventFilter(QObject *watched, QEvent *e) override;
private:QStringListModel *model;QComboBox *combox;MyBtn   *btnClose;MyBtn  *btnSplitV;MyBtn  *btnSplitH;friend     Widget;
};class Widget: public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = nullptr);
protected:virtual void resizeEvent(QResizeEvent *e) override;
protected slots:void slot_Split(QObject *sender, Qt::Orientation orient);void slot_UnSplit(QObject *sender);
private:WidgetPrivate  *d_ptr;
};#endif // WIDGET_H
//widget.cpp
#include "testwidget.h"WidgetPrivate::WidgetPrivate(QWidget *parent): QWidget{parent}
{parent->installEventFilter(this);QVBoxLayout *vlayout = new QVBoxLayout(this);QHBoxLayout *hlayout = new QHBoxLayout();hlayout->setContentsMargins(0,0,0,0);hlayout->setSpacing(1);vlayout->setContentsMargins(0,0,0,0);vlayout->setSpacing(0);QStringListModel *model = new QStringListModel({"<no document>"},this);combox = new QComboBox(this); combox->setFixedHeight(ICONSIZE);combox->setModel(model) ;hlayout->addWidget(combox);btnSplitV = new MyBtn(":/split_v.svg",hlayout,this);btnSplitH = new MyBtn(":/split_h.svg",hlayout,this);btnClose  = new MyBtn(":/close.svg",  hlayout,this);vlayout->addLayout(hlayout);//QTextEdit *t=new QTextEdit(this);t->setStyleSheet("border:none;");vlayout->addWidget(t);
}//auto-hide
bool WidgetPrivate::eventFilter(QObject *watched, QEvent *e)
{   //need parent->installEventFilterif     ( e->type()==QEvent::Enter ){ this->show(); return true;}else if( e->type()==QEvent::Leave ){ this->hide(); return true;}else return QObject::eventFilter(watched, e);
}Widget::Widget(QWidget *parent): QWidget{parent}
{d_ptr = new WidgetPrivate(this);connect(d_ptr->btnSplitV,&QToolButton::clicked,this,[=](){slot_Split(this,Qt::Vertical);});connect(d_ptr->btnSplitH,&QToolButton::clicked,this,[=](){slot_Split(this,Qt::Horizontal); });connect(d_ptr->btnClose, &QToolButton::clicked,this,[=](){slot_UnSplit(this); });setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
}void Widget::resizeEvent(QResizeEvent *e)
{d_ptr->resize(e->size().width(), d_ptr->height());QWidget::resizeEvent(e);
}void Widget::slot_Split(QObject *sender, Qt::Orientation orient)
{QSplitter *parent_sp = qobject_cast<QSplitter*>(sender->parent() );if(!parent_sp)return;//1) add new splitterQSplitter *subSP = new QSplitter(this);subSP->setHandleWidth(1);subSP->setOrientation(orient);subSP->setChildrenCollapsible(false);//2) old splitter add this new splitter as its childint index = parent_sp->indexOf(this);parent_sp->insertWidget(index,subSP);//3) new splitter add parent's childthis->setParent(subSP);subSP->addWidget(this);//4) new splitter add a new widgetWidget* testW = new Widget(subSP);subSP->addWidget(testW);
}void Widget::slot_UnSplit(QObject *sender)
{QSplitter *parent_sp = qobject_cast<QSplitter*>(sender->parent() );if(!parent_sp) return;// if("MainWindow" == parent_sp->parent()->objectName()) return; //keep the last one// move sibline to parent before delete this widget and sub-splitter  int index = parent_sp->indexOf(this);QWidget *sibline = parent_sp->widget(!index);QSplitter *sp=(QSplitter*)parent_sp->parent();if(sibline && sp){index = sp->indexOf(parent_sp);sp->replaceWidget(index,sibline);sibline->setParent(sp);}//deleteparent_sp->deleteLater();this->deleteLater();
}

Qt Dynamic QSplitter 动态分栏相关推荐

  1. shardingjdbc全局表_Sharding-JDBC动态分表实现

    Sharding-JDBC动态水平分表实现 背景: 在项目中遇到了按照日期动态水平分表的需求,系统属于监控系统,每10分钟保存一次监控数据,并且每次要采集200个节点上的数据,即每次采集数据(间隔10 ...

  2. fastreport 横向分栏_FastReport开发指南

    目  录 入门        5 绪言        6 关于FASTREPORT的说明        6 FASTREPORT的历史        6 创建报表        7 数据        ...

  3. matlab odeset慢,matcont6p1 最全最强大的非线性系统动态分岔与混沌分析软件,功能 ,可以满足绝大多数动力学要 matlab 276万源代码下载- www.pudn.com...

    文件名称: matcont6p1下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 3128 KB 上传时间: 2015-04-09 下载次数: 21 提 供 ...

  4. fastreport 横向分栏_为什么大家现在放弃使用Excel,而选择第三方报表工具呢?...

    Excel是一个电子表格程序,而不是一个数据库程序.Excel数据处理容量和速度有限制,数据可视化程度不高,都是以表格为主,虽然也能插入一些图表,但是灵活度和美观度不够,设置起来也相当麻烦,并且数据获 ...

  5. 数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据

    数仓回刷历史数据–hive设置动态分区,并向动态分区内刷入历史数据 内容目录 数仓回刷历史数据--hive设置动态分区,并向动态分区内刷入历史数据 一.问题介绍 二.问题解决思路 1 . 解决复杂逻辑 ...

  6. 基于MFC实现分栏Splitter

    1.效果 2.主要代码 主界面类: // SplitterDemoDlg.h : 头文件 //#pragma once #include "FormViewLeft.h" #inc ...

  7. fastreport 横向分栏_FastReport开发指南.doc

    FastReport开发指南 FastReport v2.4 报表设计器 开发指南 翻译:张青松 E-mail: Z_Q_S@ 二OO一年十二月 说 明 这是由小弟在去年年底开始翻译,大概花费了三个月 ...

  8. HTML怎么把文字分栏_PPT文字巨多!领导还不让删,怎么排版才高大上?

    ​本文由公众号"跟我学个P"首发. 嗨,各位木友们好呀,我是小木. 如标题所言,做PPT碰到这种"文字巨多.而且领导还不让删.并且强行要求你必须做得高大上"的情 ...

  9. 分栏报表-物品清单报表实现

    提起分栏报表,它的数据组织形式就如同小时候使用的数学作业本一样,将数据分为多栏显示,当然写作业时有的人习惯横向写,有的人则喜欢竖着写完,在写另一栏.所有的电子技术都是采用隐喻的手法,从物理世界而来,分 ...

最新文章

  1. 深度优先搜索算法在RPG游戏迷宫中的应用
  2. 关键词与关键词之间的相关度计算
  3. 计算机视觉与深度学习 | 机器学习中的数学——入门机器学习
  4. 护士计算机等级考试报名时间2015,湖南大学2015年9月全国计算机等级考试报名时间...
  5. 计算机dos通讯,PC双机通信DOS
  6. ubuntu下查看window下文本文件乱码的解决方法
  7. 诗与远方:无题(八十二)- 遇到你真好
  8. hadoop单机环境搭建
  9. java 字符菜单_java该怎么写左侧菜单树
  10. 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno...
  11. turtle库的学习
  12. VMware14虚拟机秘钥
  13. 在Idea中拉取svn分支
  14. 商业智能和分析软件市场现状及发展趋势分析-
  15. html自动拨打电话,javascript之网页点击直接拨打电话和发送短信
  16. 自媒体赚钱系列连载03:音乐人有收益自媒体平台大全
  17. sql 修改表的字段属性
  18. python爬取豆瓣影评_【python爬虫实战】爬取豆瓣影评数据
  19. Java , HashMap与Big-man
  20. H3C交换机的命名规则

热门文章

  1. 2021-03-06 5.30-6.15联易融
  2. luogu P4921 [MtOI2018]情侣?给我烧了! 加强版
  3. 【预选赛】2019中国高校计算机大赛——大数据挑战赛
  4. X头域解析 【转】
  5. causal-learn基本使用方法
  6. fatal error: pcap.h: No such file or directory
  7. mff开发者访谈_freeCodeCamp 2018纽约市杰出贡献者聚会-亮点与访谈
  8. 切换双系统ubuntu使用的显卡
  9. 最全iOS 上架指南
  10. 如何发送伪造的电子邮件