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

xiaoxiao2021-02-27  524

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(); } 效果图:
转载请注明原文地址: https://www.6miu.com/read-511.html

最新回复(0)