QTabWidget+QToolBar实现浏览器标签页

来源:互联网 发布:淘宝网店图片马云 编辑:程序博客网 时间:2024/05/02 03:05

直接上代码

/********************************************************************* author 周翔* e-mail 604487178@qq.com* blog http://blog.csdn.net/zhx6044**********************************************************************/#ifndef TABWORKSPACE_H#define TABWORKSPACE_H#include <QTabWidget>#include <QTabBar>#include <QToolBar>#include <QAction>#include <QMenu>#include <QToolButton>class TabWorkSpace : public QTabWidget{    Q_OBJECTpublic:    explicit TabWorkSpace(QWidget *parent = 0);    signals:    public slots:protected:    void resizeEvent(QResizeEvent *e);private slots:    void slt_newTab();    void slt_closeTab(int index);    void slt_showTab(QAction *a);private:    enum RESETFLAG{NEW, CLOSE, NORMAL, SPECIAL};    QToolBar *tab_control;    QAction *new_tab;    QAction *list_tabs;    QWidget *padding_widget;    void initTabControl();    /**     * @brief resetTabBar 重置TabBar     */    void resetTabBar(RESETFLAG flag);    void setListTabs();    };#endif // TABWORKSPACE_H/********************************************************************* author 周翔* e-mail 604487178@qq.com* blog http://blog.csdn.net/zhx6044**********************************************************************/#include "tabworkspace.h"#include <QDebug>TabWorkSpace::TabWorkSpace(QWidget *parent) :    QTabWidget(parent){    this->addTab(new QWidget,"utitle");    this->addTab(new QWidget,"utitle");    this->setUsesScrollButtons(true);    this->setTabsClosable(true);    this->setMovable(true);    initTabControl();    this->setCornerWidget(tab_control);    resetTabBar(NORMAL);    connect(this,SIGNAL(tabCloseRequested(int)),this,SLOT(slt_closeTab(int)));}void TabWorkSpace::resizeEvent(QResizeEvent *e){    resetTabBar(NORMAL);    QTabWidget::resizeEvent(e);}void TabWorkSpace::resetTabBar(RESETFLAG flag){    QSize size = this->size();    int tabsWidth = 0;    int tabsHeight = tabBar()->height();    int tabs = count();    if (flag == NEW || flag == NORMAL) {        for (int i = 0;i < tabs;++i) {            tabsWidth += tabBar()->tabRect(i).width();        }    } else {        for (int i = 0;i < tabs - 1;++i) {            tabsWidth += tabBar()->tabRect(i).width();        }    }    if (size.width() > tabsWidth) {        //        if (flag == SPECIAL) {            padding_widget->setMinimumWidth(size.width() - tabsWidth - 40);        } else {            padding_widget->setMinimumWidth(size.width() - tabsWidth - 35);        }        list_tabs->setVisible(false);    } else {        //        list_tabs->setVisible(true);        setListTabs();        qDebug() << "?";        padding_widget->setMinimumWidth(0);    }    padding_widget->setMinimumHeight(tabsHeight);}void TabWorkSpace::initTabControl(){    tab_control = new QToolBar();    QList<QAction*> actions;    new_tab = new QAction("+",tab_control);    list_tabs = new QAction("V",tab_control);    list_tabs->setVisible(false);    actions << new_tab << list_tabs;    tab_control->addActions(actions);    padding_widget = new QWidget();    tab_control->addWidget(padding_widget);    tab_control->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);    connect(new_tab,SIGNAL(triggered()),this,SLOT(slt_newTab()));}void TabWorkSpace::slt_newTab(){    this->addTab(new QWidget,"utitle");    if (!tabsClosable()) {        setTabsClosable(true);    }    resetTabBar(NEW);}void TabWorkSpace::slt_closeTab(int index){    widget(index)->deleteLater();    resetTabBar(CLOSE);    if (count() == 2) {        setTabsClosable(false);        resetTabBar(SPECIAL);    }}void TabWorkSpace::setListTabs(){    QMenu *list = new QMenu();    int c = count();    for (int i = 0;i < c;++i) {        QAction *action = new QAction(tabText(i),list);        action->setProperty("index", i);        list->addAction(action);    }    QMenu *old = list_tabs->menu();    delete old;    list_tabs->setMenu(list);    connect(list,SIGNAL(triggered(QAction*)),this,SLOT(slt_showTab(QAction*)));}void TabWorkSpace::slt_showTab(QAction *a){   // QAction *_sender = static_cast<QAction*> (sender());    int index = a->property("index").toInt();    setCurrentIndex(index);}/********************************************************************* author 周翔* e-mail 604487178@qq.com* blog http://blog.csdn.net/zhx6044**********************************************************************/#include <QApplication>#include "tabworkspace.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    TabWorkSpace tws;    tws.resize(640,380);    tws.show();        return a.exec();}

现在还遇到一个问题,就是点击list_tabs动作事,点击好多下菜单才出现,不知道什么原因,还希望谁给点指示。