Qt实现窗口tabwidget的拖出双击弹回功能

来源:互联网 发布:网络压力测试工具 编辑:程序博客网 时间:2024/05/01 06:45

这个功能看似简单,实现起来确实有点儿难度。在代码里详细说明吧。//CTabWidget.h#ifndef CTABWIDGET_H#define CTABWIDGET_H#include <QTabWidget>#include <QtGui>#include "CTabBar.h"class CTabWidget :public QTabWidget{    Q_OBJECTpublic:    CTabWidget(QWidget* =0);virtual ~CTabWidget(){};public:CTabBar *tabBar;};#endif // CTABWIDGET_H//CTabWidget.cpp#include "CTabWidget.h"CTabWidget::CTabWidget(QWidget *parent):QTabWidget(parent){tabBar = new CTabBar;setTabBar(tabBar);     //这里是关键,这样用我们自定义的CTabBar替换原来的QTabBar}//CTabBar.h#ifndef CTABBAR_H#define CTABBAR_H#include <QTabBar>#include <QtGui>class CTabBar :public QTabBar{Q_OBJECTpublic:CTabBar(QWidget* =0);virtual ~CTabBar(){};protected:void mousePressEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *);   //通过两个事件模拟出tab被拖动的动作private:bool pressFlag;signals:void sig_tabDrag(int,QPoint);};#endif//CTabBar.cpp#include "CTabBar.h"#include <QtGui> CTabBar::CTabBar(QWidget *parent):QTabBar(parent),pressFlag(false){ } void CTabBar::mousePressEvent(QMouseEvent *event){        if (event->button()==Qt::LeftButton)    {        pressFlag = true;    }    QTabBar::mousePressEvent(event);} void CTabBar::mouseReleaseEvent(QMouseEvent *event){    if(event->button() == Qt::LeftButton &&pressFlag )    {        pressFlag = false;             if(tabRect(currentIndex()).contains( event->pos()))            return;        emit sig_tabDrag(currentIndex(),event->pos());    }    }现在实现窗口标题栏被双击动作//CWidget.h#ifndef CWIDGET_H#define CWIDGET_H#include <QtGui/QWidget>class CWidget:public QWidget{Q_OBJECTpublic:CWidget(QWidget* = 0);~CWidget();protected:bool event(QEvent *);signals:void sig_doubleClickedTitleBar();  //被双击时发射的信号};#endif//CWidget.cpp#include "CWidget.h"#include <QtGui>CWidget::CWidget(QWidget *parent):QWidget(parent){}CWidget::~CWidget(){}bool CWidget::event(QEvent *event){#ifdef unix    if(event->type() == QEvent::MouseButtonDblClick){   //标题栏单击没反应,就单击窗口边缘替代吧        emit sig_doubleClickedTitleBar();        return true;    }#endif   if (event->type() == QEvent::NonClientAreaMouseButtonDblClick)  //这个事件在Linux下没有触发,应该算是Qt的一个Bug吧    {emit sig_doubleClickedTitleBar();return true;}    return QWidget::event(event);}//CMainWindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTextEdit>#include "CTabWidget.h"#include "CTabBar.h"class CMainWindow:public QMainWindow{Q_OBJECTpublic:CMainWindow(QWidget* = 0);  private:CTabWidget *tabWidget;private slots:    void slot_tabBarDoubleClicked();            //响应双击弹回的槽函数    void slot_tabDrag(int index,QPoint point);  //响应拖动动作的槽函数    void slot_closeTab(int);                    //关闭tab的槽函数};#endif // MAINWINDOW_H//CMainWindow.cpp#include "CMainWindow.h"#include "CTabWidget.h"#include "CWidget.h"#include <QtGui>CMainWindow::CMainWindow(QWidget *parent):QMainWindow(parent){    tabWidget = new CTabWidget(this);    tabWidget->setMovable(true);    tabWidget->setTabsClosable(true);    tabWidget->setTabShape(QTabWidget::Triangular);    //添加4个tab页    tabWidget->addTab(new QTextEdit,"eidt 1");    tabWidget->addTab(new QTextEdit,"eidt 2");    tabWidget->addTab(new QTextEdit,"eidt 3");    tabWidget->addTab(new QTextEdit,"eidt 4");    setCentralWidget(tabWidget);    connect(tabWidget->tabBar,SIGNAL(sig_tabDrag(int,QPoint)),this,SLOT(slot_tabDrag(int,QPoint)));    connect(tabWidget,SIGNAL(tabCloseRequested(int)),this,SLOT(slot_closeTab(int)));    connect(tabWidget,SIGNAL(currentChanged(int)),tabWidget,SLOT(setCurrentIndex(int)));    resize(800,600);}void CMainWindow::slot_tabDrag(int index,QPoint point){    CWidget *widget = new CWidget;    QWidget *draged = tabWidget->widget(index);    QString windowName = tabWidget->tabText(index);    tabWidget->removeTab(index);    connect(widget,SIGNAL(sig_doubleClickedTitleBar()),this,SLOT(slot_tabBarDoubleClicked()));    QGridLayout *layout = new QGridLayout;    layout->addWidget(draged);    widget->setLayout(layout);    widget->resize(600,400);    widget->move(point+pos()+tabWidget->pos());    widget->setWindowTitle(windowName);    widget->show();    draged->show();}void CMainWindow::slot_tabBarDoubleClicked(){    CWidget *widget = qobject_cast<CWidget*>(sender());    QObjectList list = widget->children();    QTextEdit *edit = NULL;        for(int i = 0;i<list.count();++i)    {        if(list[i]->inherits("QTextEdit"))        {            edit = qobject_cast<QTextEdit*>(list[i]);            break;        }    }    if(edit == NULL)    {        return ;    }    edit->setParent(tabWidget);    tabWidget->addTab(edit,widget->windowTitle());    delete widget;}void CMainWindow::slot_closeTab(int index){    QWidget *draged = tabWidget->widget(index);    tabWidget->removeTab(index);    delete draged;}//main.cpp#include "CMainWindow.h"#include <QApplication>#include <QCleanlooksStyle>int main(int argc,char **argv){    QApplication app(argc,argv);    QApplication::setStyle(new QCleanlooksStyle);    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));    CMainWindow mainwindow;mainwindow.show();    return app.exec();}


原创粉丝点击