qt使用tab管理多个界面
2015-07-21 18:32
597 查看
1.需求
要求实现多个页面之间的切换
2.解决
打算采用tab页来管理多个页面,并隐藏tab头
3.代码
main.cpp
#include "mytab.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); mytab w; w.show(); return a.exec(); }
mytab.h
#ifndef MYTAB_H #define MYTAB_H #include <QtWidgets/QMainWindow> #include <QResizeEvent> #include "ui_mytab.h" #include "pagemain.h" #include "pageend.h" #include "pageset.h" #include "mydefine.h" #include <QMap> #include <boost/bimap.hpp> class mytab : public QMainWindow { Q_OBJECT public: typedef boost::bimap<E_TAB_PAGE,int> MapPageIndex; public: mytab(QWidget *parent = 0); ~mytab(); private slots: void pagechange(E_TAB_PAGE page); public: E_TAB_PAGE pagetype(); protected: virtual void resizeEvent(QResizeEvent * event); private: QTabWidget m_tabWidget; //管理tab:“交接班”和“设置” PageMain m_pageMain; //主页面部分 PageEnd m_pageEnd; //交接部分 PageSet m_pageSet; //设置部分 MapPageIndex m_mapPageIndex; //页面和tab索引进行绑定 private: void init(); void resize(); private: Ui::mytabClass ui; }; #endif // MYTAB_H
mytab.cpp
#include "mytab.h" #include <QLineEdit> #include <QPushButton> #include <QVBoxLayout> #include <QSize> #include <utility> mytab::mytab(QWidget *parent) : QMainWindow(parent), m_pageMain(parent),m_pageSet(parent),m_pageEnd(parent) { ui.setupUi(this); init(); connect(&m_pageMain, SIGNAL(pagechange(E_TAB_PAGE)), this, SLOT(pagechange(E_TAB_PAGE))); connect(&m_pageEnd, SIGNAL(pagechange(E_TAB_PAGE)), this, SLOT(pagechange(E_TAB_PAGE))); connect(&m_pageSet, SIGNAL(pagechange(E_TAB_PAGE)), this, SLOT(pagechange(E_TAB_PAGE))); //这里可以发送两次信号 这样不实时 m_pageEnd.init(this); m_pageMain.init(this); m_pageSet.init(this); } mytab::~mytab() { } void mytab::init() { //m_mapPageIndex.clear(); //对tab进行设置下这里要 //必须设置父类,否则tab显示为另一个窗口 m_tabWidget.setParent(this); m_tabWidget.setStyleSheet( "QTabWidget::pane{border: 0px;}" "QTabWidget::tab-bar{alignment:center;}" "QTabBar::tab{background:transparent; color:white; min-width:30ex; min-height:10ex;}" "QTabBar::tab:hover{background:rgb(255, 255, 255, 100);}" "QTabBar::tab:selected{border-color: white;background:white;color:green;}"); //隐藏QTabWidget,否则主窗口被覆盖 //m_tabWidget.hide(); //隐藏tab m_tabWidget.tabBar()->hide(); //设置tab可关闭 m_tabWidget.setTabsClosable(true); //添加tab int nindex = -1; nindex = m_tabWidget.addTab(&m_pageMain,tr("pagemain")); if (nindex != -1) m_mapPageIndex.insert(MapPageIndex::value_type(E_MAIN_PAGE, nindex)); //m_mapPageIndex[E_MAIN_PAGE] = nindex; nindex = m_tabWidget.addTab(&m_pageSet,tr("pageset")); if (nindex != -1) m_mapPageIndex.insert(MapPageIndex::value_type(E_SET_PAGE, nindex)); //m_mapPageIndex[E_SET_PAGE] = nindex; nindex = m_tabWidget.addTab(&m_pageEnd,tr("pageend")); if (nindex != -1) m_mapPageIndex.insert(MapPageIndex::value_type(E_END_PAGE, nindex)); //m_mapPageIndex[E_END_PAGE] = nindex; //显示QTabWidget m_tabWidget.show(); QRect rtClient = this->geometry(); m_tabWidget.setGeometry(rtClient); m_pageMain.setGeometry(rtClient); pagechange(E_MAIN_PAGE); } void mytab::resizeEvent(QResizeEvent * event) { resize(); } void mytab::resize() { QSize szClient = this->size(); m_tabWidget.setGeometry(0, 0, szClient.width(), szClient.height()); QWidget *ptab = m_tabWidget.currentWidget(); if (ptab != nullptr) ptab->setGeometry(0, 0, szClient.width(), szClient.height()); } void mytab::pagechange(E_TAB_PAGE page) { //这里查询左map MapPageIndex::left_const_iterator it = m_mapPageIndex.left.find(page); if (it != m_mapPageIndex.left.end()) { m_tabWidget.setCurrentIndex(it->second); resize(); } } E_TAB_PAGE mytab::pagetype() { E_TAB_PAGE page = E_INVALID_PAGE; int nindex = m_tabWidget.currentIndex(); if (nindex != -1) { MapPageIndex::right_const_iterator it = m_mapPageIndex.right.find(nindex); if (it != m_mapPageIndex.right.end()) page = it->second; } return page; }
pagemain.h
#ifndef PAGEMAIN_H #define PAGEMAIN_H #include <QWidget> #include "ui_pagemain.h" #include "mydefine.h" class PageMain : public QWidget { Q_OBJECT public: PageMain(QWidget *parent = 0); ~PageMain(); public: void init(QWidget *pParent); signals: void pagechange(E_TAB_PAGE page); private slots: void on_endButton_clicked(); void on_setButton_clicked(); void on_typeButton_clicked(); private: Ui::PageMain ui; QWidget *m_pParent; }; #endif // PAGEMAIN_H
pagemain.cpp
#include "pagemain.h" #include "mytab.h" #include <QMessageBox> PageMain::PageMain(QWidget *parent) : QWidget(parent) { ui.setupUi(this); m_pParent = nullptr; } PageMain::~PageMain() { } void PageMain::on_endButton_clicked() { emit this->pagechange(E_END_PAGE); } void PageMain::on_setButton_clicked() { emit this->pagechange(E_SET_PAGE); } void PageMain::on_typeButton_clicked() { if (m_pParent != nullptr) { E_TAB_PAGE page = ((mytab *)m_pParent)->pagetype(); QString strMsg(""); strMsg = QString("%1").arg(page); QMessageBox::information(this, "page", strMsg); } } void PageMain::init(QWidget *pParent) { m_pParent = pParent; }
mydefine.h
#ifndef MY_DEFINE_H #define MY_DEFINE_H typedef enum eTabPages { E_MAIN_PAGE, E_SET_PAGE, E_END_PAGE, E_INVALID_PAGE }E_TAB_PAGE; #endif
PageSet和PageEnd与PageMain较为相似 不进行上传
4.备注
1.tab中的widget必须要有父类(否则可能会出现问题)
2.项目牵涉到由类型找tab索引和tab索引查找类型 故使用了boost的bimap来实现双向查找
3.在vs2010+qt5.40+win7上编译通过
相关文章推荐
- QT学习 第一章:基本对话框
- expand 与 unexpand 命令实例教程
- 使用Shiboken为C++和Qt库创建Python绑定
- 让DOS下输入命令时也可以象Linux一样用Tab键进行命令自动填充
- javascript 定时自动切换的选项卡Tab
- javascript+css 新闻显示tab 选项卡效果
- javascript实现textarea中tab键的缩排处理方法
- 表现、结构、行为分离的选项卡效果
- Enter转换为Tab的小例子(兼容IE,Firefox)
- jQuery简单tab切换效果实现方法
- 基于jquery的修改当前TAB显示标题的代码
- jQuery实现tab选项卡效果的方法
- Qt定时器和随机数详解
- 可以自动轮换的页签 tabs with auto play fucntion
- CSS+Js遮罩效果的TAB及焦点图片切换(推荐)
- javascript仿126邮箱TAB切换效果
- 基于JQuery的6个Tab选项卡插件
- javascript 回车替换成TAB的脚本
- Android中实现可滑动的Tab的3种方式
- 实用的Jquery选项卡TAB示例代码