首页 > 编程知识 正文

自定义标签怎么设置,qt tabwidget隐藏分页

时间:2023-05-03 17:30:46 阅读:21099 作者:844

0 .效果(声明:这只是个测试,不是很满意,放着也没用就分享下)

实现效果GIF :

完整的代码链接: https://github.com/gong jianbo/mytest code/tree/master/Qt/mytab构件

相关参考: https://www.cn blogs.com/findumars/p/5175984.html

相关参考: https://github.com/mrx y001/Qt-dragabletabwidget

1 .实现QTabWidget进程的选项卡只需拖动交换顺序,拖动选项卡&; 没有放下的功能。 可以通过继承QTabBar并重新实现部分接口来实现此功能。

首先是标签的拖动。 主要由QTabBar的鼠标事件处理。 拖动QTabBar区域将生成QDrag以显示选项卡的快照,然后跟随鼠标。

释放鼠标时,如果您不在QTabBar中,页面将从QTabBar中删除,并显示为独立窗口。

然后是标签拖动,判断鼠标释放时的位置,如果在q标签范围内,则添加到q标签中。

(1.目前这种方式效果不理想,太生硬了,没有浏览器Tab拖拽那种流畅的感觉,后期修改的话可能需要实时判断位置,而不是鼠标释放时才去处理;2.没有很好的利用Qt的drag drop事件接口,后期可以尝试下;3.QTabWidget很多默认的效果不大好,比如TabBar占据宽度居然是根据页签总宽而不是TabWidget占的宽度,这样判断区域也不方便,还有Tab页过多时的左右按钮也不好用,如果时间足够的话,最好重写)

主要代码片段:

voidmytabbar :3360 mousepressevent (qmouseevent * event ) qtabbar33603360mousepressevent ) event ); if (事件按钮(==Qt :3360 leftbuttoncurrentindex )=0) /保存状态//pressPos=event-pos ); theDragPress=true; } voidmytabbar :3360 mousemove event (qmouseevent * event ) qtabbar33603360mousemoveevent ); //move时button为NoButton,但button's是否超出了if(thedragpressevent-buttons () ) tabbar的范围if ) (! theDragOut! contentsRect ().contains (event-pos ) ) ) { theDragOut=true; emitbegindragout (this-current index ); //QDrag.exec之后,不会触发release。 自己手动触发//但是,他似乎要在鼠标被弹出后再进行动画。 解决qmouseevent * e=newq mouse event (q event 3360: mousebuttonrelease )。 this-mapfromglobal (qcursor :3360 pos )、Qt:3360leftbutton、Qt:3360leftbutton、Qt:NoModifier )//q复制:3360开机自检事件(this,e; } } voidmytabbar :3360 mousereleaseevent (qmouseevent * event ) q tabbar 33603360 mousereleaseevent ) event; theDragPress=false; theDragOut=false; } voidmytabwidget :3360 inittab bar () mytabbar*bar=newmytabbar ) this ); //setTabBar是受保护的成员函数,必须继承settabbar(bar )才能使用。 单击//选项卡上的关闭按钮,将触发信号connect(bar,q tabbar 33603360 tabcloserequested,this,mytab构件: r

emoveNormalIndex); //拖拽到外部-还未释放鼠标 connect(bar,&MyTabBar::beginDragOut,this,[this,bar](int index){ if(!indexValid(index)) return; QWidget *drag_tab=this->widget(index); //固定tab就不让拖出 if(!drag_tab||fixedPage.contains(drag_tab)) return; //把当前页作为快照拖拽 //尺寸加了标题栏和边框 QPixmap pixmap(drag_tab->size()+QSize(2,31)); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); if(painter.isActive()) { //这里想做标题栏贴在内容之上 //但是没法获取默认标题栏的图像啊,就随便画一个矩形框 //如果设置了外部主题颜色,需要改下 QRect title_rect{0,0,pixmap.width(),30}; painter.fillRect(title_rect,Qt::white); painter.drawText(title_rect,Qt::AlignLeft|Qt::AlignVCenter," "+drag_tab->windowTitle()); painter.drawRect(pixmap.rect().adjusted(0,0,-1,-1)); } painter.end(); drag_tab->render(&pixmap,QPoint(1,30)); QMimeData *mime=new QMimeData; QDrag *drag=new QDrag(bar); drag->setMimeData(mime); drag->setPixmap(pixmap); drag->setHotSpot(QPoint(10,0)); //鼠标弹起后drag就释放了,这时候去判断是否拖拽到了外部 connect(drag,&QDrag::destroyed,this,[=]{ QPoint bar_point=bar->mapFromGlobal(QCursor::pos()); //不在范围,拖出 if(!bar->contentsRect().contains(bar_point)){ popPage(drag_tab); } }); drag->exec(Qt::MoveAction); });}void MyTabWidget::popPage(QWidget *page){ takeNormalPage(page); //这里套一个自定义标题栏的窗口给page MyTabPopup *pop=new MyTabPopup(this); pop->setAttribute(Qt::WA_DeleteOnClose); pop->setContentWidget(page); pop->setWindowTitle(page->windowTitle()); pop->resize(page->size()); //拖出来的位置有点偏移 pop->move(QCursor::pos()-QPoint(10,10)); //判断独立窗口是否拖回tab connect(pop,&MyTabPopup::dragRelease,this,[=](const QPoint &pos){ const QPoint bar_pos=tabBar()->mapFromGlobal(pos); //如果又拖回了tabbar范围内,就把widget取出来放回tab if(tabBar()->contentsRect().contains(bar_pos)) { QWidget *content=pop->getContentWidget(); this->appendNormalPage(content); pop->disconnect(); //关闭的时候会在原来的位置闪一下? pop->close(); //this->activateWindow(); } }); pop->show(); page->show(); pop->activateWindow(); pop->setFocus();}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。