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