QT开发中文网

label布局,将顶层拖动后,下面自动布局

在Qt中,如果你想实现一个可以拖动的QLabel并且在拖动后自动重新布局,可以结合使用 QDrag 和布局管理器。以下是一个示例代码,展示如何实现这一功能。

示例代码

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QMouseEvent>

class DraggableLabel : public QLabel {
    Q_OBJECT

public:
    DraggableLabel(const QString &text, QWidget *parent = nullptr)
        : QLabel(text, parent) {
        setAutoFillBackground(true);
        setAcceptDrops(true);
        setStyleSheet("background-color: lightgray;");
    }

protected:
    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            dragStartPosition = event->pos();
        }
        QLabel::mousePressEvent(event);
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        if (event->buttons() & Qt::LeftButton) {
            if ((event->pos() - dragStartPosition).manhattanLength() >= QApplication::startDragDistance()) {
                QDrag *drag = new QDrag(this);
                QMimeData *mimeData = new QMimeData;
                mimeData->setText(text());
                drag->setMimeData(mimeData);
                
                // Start the drag operation
                drag->exec();
            }
        }
        QLabel::mouseMoveEvent(event);
    }

private:
    QPoint dragStartPosition;
};

class DragDropWidget : public QWidget {
    Q_OBJECT

public:
    DragDropWidget() {
        setAcceptDrops(true);
        
        layout = new QVBoxLayout(this);

        for (int i = 0; i < 5; ++i) {
            DraggableLabel *label = new DraggableLabel(QString("Draggable Label %1").arg(i + 1), this);
            layout->addWidget(label);
        }

        setLayout(layout);
    }

protected:
    void dragEnterEvent(QDragEnterEvent *event) override {
        if (event->mimeData()->hasText()) {
            event->acceptProposedAction();
        }
    }

    void dropEvent(QDropEvent *event) override {
        QString text = event->mimeData()->text();
        
        // Create a new label with the dropped text
        DraggableLabel *newLabel = new DraggableLabel(text, this);
        
        // Add to the layout and automatically adjust
        layout->addWidget(newLabel); 
       
       // Optionally remove or reorder existing labels here
        
       event->acceptProposedAction(); // Accept the drop action
       layout->update(); // Update the layout
   }

private:
   QVBoxLayout* layout;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    DragDropWidget window;
    window.setWindowTitle("Draggable Labels Example");
    window.resize(400, 300);
    
   window.show();

   return app.exec();
}

#include "main.moc"

说明

  1. DraggableLabel 类:继承自 QLabel,重写了 mousePressEventmouseMoveEvent 方法以支持拖动。按下鼠标时记录位置,并在移动超过一定距离时开始拖动。

  2. DragDropWidget 类

    • 在构造函数中创建多个可拖动的标签。
    • 重写 dragEnterEventdropEvent 方法以处理标签的放置操作。接受文本数据并将其作为新标签添加到布局中。
  3. 动态更新布局:每次拖放之后,新添加的标签会自动加入到垂直布局中,Qt 的布局管理器会自动处理排列和调整大小。

编译和运行

确保您已经安装了Qt开发环境,将上述代码复制到新的Qt项目中,然后编译运行。这段代码将创建一个窗口,其中包含多个可以被拖动的新标签。当您将现有标签移动到新的位置或添加新标签时,布局会自动更新。


内容由零声教学AI助手提供,问题来源于学员提问

目录导航
  • 示例代码
  • 说明
  • 编译和运行
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=13253

    分享:
    扫描分享到社交APP
    上一篇
    下一篇
    发表列表
    游客 游客
    此处应有掌声~
    评论列表

    还没有评论,快来说点什么吧~

    联系我们

    在线咨询: 点击这里给我发消息

    微信号:3007537140

    上班时间: 10:30-22:30

    关注我们
    x

    注册

    已经有帐号?