QT像浏览器一样Tab按钮长按可以拖动出一个窗口,然后可以拖回去
时间: 2024-03-30 20:33:44 浏览: 61
是的,QT中可以通过使用QTabBar来实现类似于浏览器中的选项卡。通过调用QTabBar的setTabsClosable()方法,您可以使选项卡可关闭。而通过调用QTabBar的setMovable()方法并将其设置为true,您可以使选项卡变得可移动。这样,用户就可以长按选项卡并将其拖动到另一个窗口中,然后再将其拖回到原始窗口中。
相关问题
QT像浏览器一样变迁可以拖动出一个窗口,然后可以拖回去
是的,QT提供了一种名为QDockWidget的窗口部件,它允许用户将其拖动到主窗口的边缘或浮动。您可以使用QMainWindow作为主窗口,并将QDockWidget添加到其中。用户可以将QDockWidget拖动到主窗口的边缘或浮动。一旦用户将其拖回到主窗口的边缘,QDockWidget将自动停靠在那里。
QTabWidget和QTabBar使用做出一个可以拖动的窗口,长按点击将窗口拖出来,也可以拖回去
可以通过设置QTabBar的mousePressEvent和mouseMoveEvent函数来实现拖拽效果。具体的实现方法如下:
首先,在QTabBar的mousePressEvent函数中记录下鼠标按下时的位置和选中的tab索引:
```
void MyTabBar::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_startPos = event->pos();
m_draggedTabIndex = tabAt(event->pos());
}
QTabBar::mousePressEvent(event);
}
```
然后,在QTabBar的mouseMoveEvent函数中判断如果鼠标移动距离大于一个阈值(比如5像素),就认为用户想要拖拽选中的tab,此时创建一个拖拽窗口,并将拖拽窗口设置为半透明,然后将选中的tab从QTabWidget中移除:
```
void MyTabBar::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
if ((event->pos() - m_startPos).manhattanLength() >= QApplication::startDragDistance()) {
QMimeData *mimeData = new QMimeData();
mimeData->setText(tabText(m_draggedTabIndex));
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
QPixmap pixmap(size());
render(&pixmap);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - rect().topLeft());
QWidget *draggedWidget = tabWidget()->widget(m_draggedTabIndex);
tabWidget()->removeTab(m_draggedTabIndex);
QPointer<QWidget> w = draggedWidget;
drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
if (w && !w->parent()) {
// Tab was not dropped on a valid target, so it needs to be reinserted
tabWidget()->insertTab(m_draggedTabIndex, w, tabText(m_draggedTabIndex));
}
}
}
QTabBar::mouseMoveEvent(event);
}
```
最后,在拖拽窗口的dragEnterEvent和dropEvent函数中实现拖拽窗口的放置。当拖拽窗口放置在一个有效的位置时,将拖拽窗口中的内容插入到QTabWidget中:
```
void MyTabBar::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasText()) {
event->acceptProposedAction();
}
}
void MyTabBar::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasText()) {
QString text = event->mimeData()->text();
int index = tabAt(event->pos());
if (index != -1) {
tabWidget()->insertTab(index, new QLabel(text), text);
event->acceptProposedAction();
}
}
}
```
这样就实现了可以拖动的窗口,长按点击将窗口拖出来,也可以拖回去的效果。
阅读全文