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();
}
效果图: