I was already close. Here's the solution:
setAcceptDrops(true);
_tab_drag_index = -1;
_tab_drag_tab_bar = NULL;
_tab_drag_timer
= new QTimer(this);
_tab_drag_timer->setSingleShot(True);
connect(_tab_drag_timer, SIGNAL(timeout()); this, SLOT(_auto_switch_tab));
}
event.accept();
}
_tab_drag_timer.stop();
event.accept();
}
QTabBar * tabBar
= dynamic_cast<QTabBar
*>
(childAt
(event.
pos));
if (tabBar == NULL || tabBar->parent() != this) {
event->ignore();
return;
}
QPoint global_pos
= mapToGlobal
(event
->pos
());
QPoint widget_pos
= tabBar
->mapFromGlobal
(global_pos
);
int tab_index = tabBar->tabAt(widget_pos);
if (tab_index != _tab_drag_index && tabBar != _tab_drag_tab_bar) {
_tab_drag_timer->stop();
_tab_drag_index = tab_index;
_tab_drag_tab_bar = tabBar;
}
if (tab_index == -1) {
event->ignore();
return
}
event->accept();
}
void _auto_switch_tab() {
if (!_tab_drag_tab_bar || _tab_drag_index == -1)
return;
_tab_drag_tab_bar->setCurrentIndex(_tab_drag_index);
_tab_drag_tab_bar = NULL;
_tab_drag_index = -1;
}
MyMainWindow(QWidget * parent) : QMainWindow(parent) {
setAcceptDrops(true);
_tab_drag_index = -1;
_tab_drag_tab_bar = NULL;
_tab_drag_timer = new QTimer(this);
_tab_drag_timer->setSingleShot(True);
connect(_tab_drag_timer, SIGNAL(timeout()); this, SLOT(_auto_switch_tab));
}
void dragEnterEvent(QDragEnterEvent * event) {
event.accept();
}
void dragLeaveEvent(QDragLeaveEvent * event) {
_tab_drag_timer.stop();
event.accept();
}
void dragMoveEvent(QDragMoveEvent * event) {
QTabBar * tabBar = dynamic_cast<QTabBar *>(childAt(event.pos));
if (tabBar == NULL || tabBar->parent() != this) {
event->ignore();
return;
}
QPoint global_pos = mapToGlobal(event->pos());
QPoint widget_pos = tabBar->mapFromGlobal(global_pos);
int tab_index = tabBar->tabAt(widget_pos);
if (tab_index != _tab_drag_index && tabBar != _tab_drag_tab_bar) {
_tab_drag_timer->stop();
_tab_drag_index = tab_index;
_tab_drag_tab_bar = tabBar;
_tab_drag_timer->start(QApplication.startDragTime());
}
if (tab_index == -1) {
event->ignore();
return
}
event->accept();
}
void _auto_switch_tab() {
if (!_tab_drag_tab_bar || _tab_drag_index == -1)
return;
_tab_drag_tab_bar->setCurrentIndex(_tab_drag_index);
_tab_drag_tab_bar = NULL;
_tab_drag_index = -1;
}
To copy to clipboard, switch view to plain text mode
Bookmarks