QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】
来源:互联网 发布:360软件宝库 编辑:程序博客网 时间:2024/05/18 01:45
近期做QT,我也是新手,这个主要是用重构父类事件实现的,即子类化。
此文章是在http://blog.csdn.net/zmm19861210/article/details/9036779上看到的,但是我做了一定的修改[备注:下方的代码上未体现,还是老代码],我做了析构函数的修改,就是将堆上那些new出来的私有变量给delete掉,由于代码是在主机上调试的,公司使用远程桌面方式上网,所以没有权限上传到远程桌面来整个demo真是遗憾。
这个功能看似简单,实现起来确实有点儿难度。在代码里详细说明吧。//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();}
0 0
- QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】
- Qt实现窗口tabwidget的拖出双击弹回功能
- Android - TabHost 选项卡功能用法详解&&TabWidget切换卡的实现应用&&实例说明
- Android - TabHost 选项卡功能用法详解&&TabWidget切换卡的实现应用&&实例说明
- QT实现无边框窗体的最小化,最大化/还原,关闭,拖动和双击最大化等功能
- stackWidget实现类似与TabWidget的功能
- 在标题栏添加更多选项的功能
- 【Qt】自定义标题栏并实现最小化/最大化/关闭窗口功能
- PYQT 实现TabWidget 双击关闭功能 (附源码)
- Qt实现窗口整体拖拽功能.
- android 实现了知乎日报的大部分功能,增加双击标题栏回到顶部以及双击 webview 返回两个实用功能
- QT实现拖动没有标题栏的窗口
- 一个单独的条形码扫描功能实现
- Qt实现拖拽数据的功能
- mfc实现播放器功能,双击全屏,再双击还原
- Android中选项卡功能的实现
- 简单的选项卡功能实现
- Android 选项卡功能的实现
- xcode快捷键
- VC++6.0的BUG的解决方法
- ACRush 楼天成 回忆录
- ConcurrentModificationException异常
- SQL
- QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】
- Adobe Dreamweaver CS5中文版安装
- IOS 图像OPENGLES中的旋转
- wince注册表文件platform.reg详解
- POJ 2251 Dungeon Master
- 初识云计算001
- QT 解析 魔兽API返回Jsion数据
- hbase中region分裂设置
- git 回滚