Qt 4 中 QTabWidget 原生关闭按钮(X)过小,触屏设备难以点击。参考浏览器双击标签关闭交互,尝试绑定 DoubleClick 信号但 QTabWidget 无对应 Slot。QTabBar 为 protected,外部无法直接获取鼠标事件。
class Tab : public QTabWidget {
Q_OBJECT
public:
Tab(QWidget *parent = nullptr) : QTabWidget(parent) {}
QTabBar* GetBar() { return tabBar(); } // 暴露 protected tabBar()
protected:
void mousePressEvent(QMouseEvent *event) override {
// 可选:记录按下位置等
QTabWidget::mousePressEvent(event);
}
};
class MyEventFilter : public QObject {
Q_OBJECT
public:
bool eventFilter(QObject *object, QEvent *event) override {
if (event->type() == QEvent::MouseButtonDblClick) {
QMouseEvent *me = static_cast(event);
QPoint pos = me->pos();
// 获取当前标签页几何区域(需外部同步更新)
if (pos.x() >= tabLeft && pos.x() <= tabLeft + tabWidth &&
pos.y() >= tabTop && pos.y() <= tabTop + tabHeight) {
tabWidget->removeTab(currentTabIndex);
}
}
return QObject::eventFilter(object, event);
}
};
全局安装:
qApp->installEventFilter(new MyEventFilter());
void MainWindow::updateBar() {
currentTabIndex = tabWidget->currentIndex();
QTabBar *bar = tabWidget->GetBar();
tabWidth = bar->tabRect(currentTabIndex).width(); // 单个标签宽度
tabLeft = bar->tabRect(currentTabIndex).left();
tabTop = bar->tabRect(currentTabIndex).top();
tabHeight = bar->height();
}
连接 currentChanged(int) 信号到 updateBar()。
index 不一致。qApp 全局捕获,避免逐个控件安装。此方案兼容 Qt 4/5/6,解决触屏交互痛点,代码侵入性极小。