QTabWidget双击tabBar的窗口弹出和弹入

QTabWidget双击tabBar的窗口弹出和弹入

项目上遇到问题,本来  void QMainWindow::tabifyDockWidget(QDockWidget *first, QDockWidget *second)可以解决问题的。
但是项目要求双击tab页实现窗口的弹出和弹入。为此用了QTabWidget 类。qt版本 5.7.1  编译器:
源码:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
 
#include <QMainWindow>
class QTabWidget;
class QHBoxLayout;
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initCentralWidget();
    void initDockWidget();
public slots:
    void floatWidget(int index);
    void backToTabwidget(QObject* obj);
protected:
    bool eventFilter(QObject *obj, QEvent *event);
private:
    QDockWidget* mDockA;
    QDockWidget* mDockB;
    QTabWidget* mTabWidget;
    QHBoxLayout* mMainLayout;
};
 
 
#endif // MAINWINDOW_H
 //mainwindow.cpp 
#include "mainwindow.h"
#include <QDockWidget>
#include <QPlainTextEdit>
#include <QHBoxLayout>
#include <QWidget>
#include <QTabWidget>
#include <QDebug>
#include <QApplication>
#include <QDesktopWidget>
#include <QEvent>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,600);
    initCentralWidget();
    initDockWidget();
}
 
 
MainWindow::~MainWindow()
{
 
 
}
 
 
void MainWindow::initCentralWidget()
{
    QWidget* widget = new QWidget(this);
    setCentralWidget(widget);
    mMainLayout = new QHBoxLayout();
    mMainLayout->setMargin(0);
    mMainLayout->setSpacing(0);
    widget->setLayout(mMainLayout);
    QPlainTextEdit* plainTextEdit = new QPlainTextEdit(this);
    plainTextEdit->appendPlainText("dockWidget Test!");
    mMainLayout->addWidget(plainTextEdit);
}
 
 
void MainWindow::initDockWidget()
{
    mDockA = new QDockWidget(this);
    mDockA->setAllowedAreas(Qt::RightDockWidgetArea | Qt::LeftDockWidgetArea);
    mDockA->setFeatures(QDockWidget::DockWidgetMovable |QDockWidget::DockWidgetFloatable);
    mDockA->setTitleBarWidget(new QWidget());
    QPlainTextEdit* editA = new QPlainTextEdit(mDockA);
    editA->appendPlainText("dockA");
    editA->setEnabled(false);
 
 
    mDockB = new QDockWidget(this);
    mDockB->setAllowedAreas(Qt::RightDockWidgetArea);
    mDockB->setFeatures(QDockWidget::DockWidgetMovable  | QDockWidget::DockWidgetFloatable );
    mDockB->setTitleBarWidget(new QWidget());
    QPlainTextEdit* editB = new QPlainTextEdit(mDockB);
    editB->appendPlainText("dockB");
    editB->setEnabled(false);
 
 
    mTabWidget = new QTabWidget(this);
    mTabWidget->addTab(mDockA,"testA");
    mTabWidget->addTab(mDockB,"testB");
    connect(mTabWidget,SIGNAL(tabBarDoubleClicked(int)),this,SLOT(floatWidget(int)));
    mMainLayout->addWidget(mTabWidget);
}
 
 
void MainWindow::floatWidget(int index)
{
    //获取tab下的widget
    QWidget* childWidget = mTabWidget->widget(index);
    QWidget* floatingWidget = new QWidget();
    floatingWidget->resize(800,600);
    QString windowTilte = mTabWidget->tabText(index);
    //安装事件监视器
    floatingWidget->installEventFilter(this);
    //设置标题
    floatingWidget->setWindowTitle(windowTilte);
 
 
    //移除tab
    mTabWidget->removeTab(index);
    QHBoxLayout* layout = new QHBoxLayout(floatingWidget);
    floatingWidget->setLayout(layout);
    layout->addWidget(childWidget);
    //居中
    floatingWidget->move((QApplication::desktop()->width()-floatingWidget->width())/2,
                         (QApplication::desktop()->height()-floatingWidget->height())/2);
    floatingWidget->show();
    childWidget->show();
}
 
 
void MainWindow::backToTabwidget(QObject *obj)
{
    QObjectList objList = obj->children();
    foreach (QObject* object, objList)
    {
       QDockWidget* dockWidget = qobject_cast<QDockWidget*>(object);
        if(dockWidget)
        {
            QString windowTitle = qobject_cast<QWidget*>(obj)->windowTitle();
            //重新插入tab,如果想tab顺序不变,可以用insertTab()
            mTabWidget->addTab(dockWidget,windowTitle);
        }
    }
}
 
 
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj->isWidgetType())
    {
        if (event->type() == QEvent::Close)
        {
            backToTabwidget(obj);
            return true;
        }
        else
        {
            return false;
        }
    } else
    {
        // pass the event on to the parent class
        return QMainWindow::eventFilter(obj, event);
    }
}
 //main.cpp 
#include "mainwindow.h"
#include <QApplication>
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
 
    return a.exec();
}
 
 
效果图:
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值