当前位置: 移动技术网 > IT编程>开发语言>Java > QTabWidget标签实现双击关闭的方法(推荐)

QTabWidget标签实现双击关闭的方法(推荐)

2019年07月22日  | 移动技术网IT编程  | 我要评论

用qt做arm,发现qt4中qtabwidget原生的关闭按键(x)太小,用触摸板很难按到。于是乎想到类似于浏览器的双击关闭功能,因为之前做过c#的资源管理器,以为可以直接绑定doubleclick,可后来翻遍了也没找到相应的slot,结果在qwidget中捕捉信号,就是没有qtabwidget标签的鼠标事件,坑爹那!随后,又在网上各种搜索,结果找到的是各种问题,每一个准确回答出来的.....最后思来想去,实在不行,就用最笨的方法,仿hock实现!

于是乎,我重载了qtabwidget(由于tabbar()是protected,坑爹啊!),这样就可以获取到标签了。

class tab : public qtabwidget
 {
 q_object
 public:
 tab(qwidget *parent = );
 qtabbar* getbar();
 protected:
 void mousepressevent(qmouseevent *event);
 }; 

然后在实现一个事件过滤器,首先判断事件是双击事件,然后判断是否为标签位置,如果是则删除当前标签页,由于双击事件中必触发单击,即标签页选中事件,因此无需考虑双击其他标签页引起的index变更问题。

#ifndef myeventfilter_h
 #define myeventfilter_h
 #include <qmainwindow>
 #include <qmouseevent>
 #include "tab.h"
 extern int tabindex_current;
 extern int tabindex_old;
 extern tab *tabwidget;
 extern qpoint tableft;
 extern int tabwidth;
 extern int tabheight;
 //实现双击关闭tab标签
 class myeventfilter: public qobject
 {
 public:
 myeventfilter():qobject()
 {};
 ~myeventfilter(){};
 bool eventfilter(qobject* object,qevent* event)
 {
 if (event->type()==qevent::mousebuttondblclick)
 {
  qmouseevent *e = static_cast<qmouseevent*>(event);
  qpoint pos = e->pos();
  int x = tableft.x();
  int x = tableft.x()+tabwidth;
  int y = tableft.y();
  int y = tableft.y()+tabheight;
  if (pos.x() >= x && pos.y() >= y && pos.x() <= x && pos.y() <= y)
  tabwidget->removetab(tabindex_current);
 }
 return qobject::eventfilter(object,event);
 };
 };
 #endif // myeventfilter_h 

最后绑定到主函数main中,这样就可捕捉到所有的事件了:

qapp->installeventfilter(new myeventfilter());

另外,需在标签页切换时更新宽度信息(高度无需更新):

 void mainwindow::updatebar()
 {
 tabindex_current = tabwidget->currentindex();
 tabindex_old = tabindex_current;
 qtabbar *bar = tabwidget->getbar();
 if (bar->size().width() > )
  tabwidth = bar->size().width();
 }

以上所述是小编给大家介绍的qtabwidget标签实现双击关闭的方法(推荐),希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网