QT像浏览器一样变迁可以拖动出一个窗口,然后可以拖回去
时间: 2024-03-30 15:33:41 浏览: 11
是的,QT提供了一种名为QDockWidget的窗口部件,它允许用户将其拖动到主窗口的边缘或浮动。您可以使用QMainWindow作为主窗口,并将QDockWidget添加到其中。用户可以将QDockWidget拖动到主窗口的边缘或浮动。一旦用户将其拖回到主窗口的边缘,QDockWidget将自动停靠在那里。
相关问题
QT像浏览器一样Tab按钮长按可以拖动出一个窗口,然后可以拖回去
是的,QT中可以通过使用QTabBar来实现类似于浏览器中的选项卡。通过调用QTabBar的setTabsClosable()方法,您可以使选项卡可关闭。而通过调用QTabBar的setMovable()方法并将其设置为true,您可以使选项卡变得可移动。这样,用户就可以长按选项卡并将其拖动到另一个窗口中,然后再将其拖回到原始窗口中。
QT像浏览器一样Tab按钮长按可以拖动出一个窗口,然后可以拖回去的示例代码
这里是一个简单的示例代码,可以实现QT的Tab按钮长按可以拖动出一个窗口,然后可以拖回去的功能:
```cpp
#include <QTabBar>
#include <QMouseEvent>
#include <QMimeData>
#include <QDrag>
#include <QPainter>
class MyTabBar : public QTabBar
{
public:
MyTabBar(QWidget* parent = nullptr) : QTabBar(parent) {}
~MyTabBar() {}
protected:
void mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_startPos = event->pos();
}
QTabBar::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent* event)
{
if (!(event->buttons() & Qt::LeftButton))
{
return;
}
if ((event->pos() - m_startPos).manhattanLength() < QApplication::startDragDistance())
{
return;
}
int index = tabAt(m_startPos);
if (index < 0)
{
return;
}
QWidget* widget = tabButton(index, QTabBar::RightSide);
if (!widget)
{
return;
}
QPixmap pixmap(widget->size());
widget->render(&pixmap);
QMimeData* mimeData = new QMimeData;
mimeData->setData("application/x-tabbtn", QByteArray::number(index));
QDrag* drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - widget->pos());
setTabEnabled(index, false);
if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)
{
setTabEnabled(index, true);
}
else
{
setTabEnabled(index, true);
}
}
void dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData()->hasFormat("application/x-tabbtn"))
{
event->acceptProposedAction();
}
}
void dragMoveEvent(QDragMoveEvent* event)
{
if (event->mimeData()->hasFormat("application/x-tabbtn"))
{
event->acceptProposedAction();
}
}
void dragLeaveEvent(QDragLeaveEvent* event)
{
Q_UNUSED(event);
}
void dropEvent(QDropEvent* event)
{
if (event->mimeData()->hasFormat("application/x-tabbtn"))
{
QByteArray data = event->mimeData()->data("application/x-tabbtn");
int index = data.toInt();
if (index >= 0 && index < count())
{
QWidget* widget = tabButton(index, QTabBar::RightSide);
if (widget)
{
QPoint pos = event->pos() - widget->rect().center();
widget->move(pos);
widget->show();
}
}
event->acceptProposedAction();
}
}
void paintEvent(QPaintEvent* event)
{
QTabBar::paintEvent(event);
if (m_isDragging)
{
QPainter painter(this);
QPixmap pixmap = tabButton(m_dragIndex, QTabBar::RightSide)->grab();
painter.drawPixmap(m_dragPos, pixmap);
}
}
private:
QPoint m_startPos;
bool m_isDragging = false;
QPoint m_dragPos;
int m_dragIndex;
void startDrag(int index, const QPoint& pos)
{
QWidget* widget = tabButton(index, QTabBar::RightSide);
if (!widget)
{
return;
}
m_isDragging = true;
m_dragIndex = index;
m_dragPos = pos - widget->rect().center();
}
};
```
使用方法:
在创建`QTabWidget`的时候,将其`QTabBar`替换为`MyTabBar`即可:
```cpp
QTabWidget* tabWidget = new QTabWidget(this);
tabWidget->setTabBar(new MyTabBar(tabWidget));
```
希望这个示例代码能够对你有所帮助!