-
QTabWidget标签实现双击封闭
添加时间:2013-5-9 点击量:用Qt做ARM,发明Qt4中QTabWidget原生的封闭按键(X)太小,用触摸板很难按到。于是乎想到类似于浏览器的双击封闭功能,因为之前做过C#的资料经管器,认为可以直接绑定DoubleClick,可后来翻遍了也没找到响应的SLOT,成果在QWidget中捕获旌旗灯号,就是没有QTabWidget标签的鼠标事务,坑爹那!随后,又在网上各类搜刮,成果找到的是各类题目,每一个正确答复出来的.....最后思来想去,其实不可,就用最笨的办法,仿Hock实现!
于是乎,我重载了QTabWidget(因为tabBar()是protected,坑爹啊!),如许就可以获取到标签了。
class Tab : public QTabWidget
{
Q_OBJECT
public:
Tab(QWidget parent = 0);
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 x1 = tableft.x();
int x2 = tableft.x()+tabwidth;
int y1 = tableft.y();
int y2 = tableft.y()+tabheight;
if (pos.x() >= x1 && pos.y() >= y1 && pos.x() <= x2 && pos.y() <= y2)
tabWidget->removeTab(tabindex_current);
}
return QObject::eventFilter(object,event);
};
};
#endif // MYEVENTFILTER_H最后绑定到主函数main中,如许就可捕获到所有的事务了:
qApp->installEventFilter(new myEventFilter());
别的,需在标签页切换时更新宽度信息(高度无需更新):
void MainWindow::Bar()
{
tabindex_current = tabWidget->currentIndex();
tabindex_old = tabindex_current;
QTabBar bar = tabWidget->GetBar();
if (bar->size().width() > 0)
tabwidth = bar->size().width();
}