图片的拖动布局

此例实现将图片拖动到窗口中展示,并实现随着图片个数整体的布局也发生变化。
主要代码如下:
拖动进入事件

void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(!event->mimeData()->urls()[0].fileName().right(3).compare("png")
       ||!event->mimeData()->urls()[0].fileName().right(3).compare("jpg"))
    {
        event->acceptProposedAction();
    }
    else
    {
        event->ignore();
    }
}

void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData* mime = event->mimeData();
    QPixmap pix(mime->urls()[0].toLocalFile());

    //实现图片的自动布局
    emit signalCreateLabel(pix);
}

程序继承自mainwindow,重写了dragEnterEvent事件和dropEvent事件,并做了筛选,只有png和jpg才能拖动到窗口中,拖动释放后发送信号,创建显示图片的label,然后布局。

void MainWindow::slot_createLabel(QPixmap pix)
{
    if(m_count != 0 && m_count % 3 == 0)
    {
        m_row++;
        m_count = 0;
    }
    m_count++;

    //创建qlabel,并存入list中
    QLabel *imageLabel = new QLabel;
    imageLabel->setScaledContents(true);
    imageLabel->setPixmap(pix);
    layoutWidget(imageLabel,m_row,m_count-1);
}

布局中以3列为一行。也可以加载图片。

void MainWindow::on_action_Open_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,tr("选择文件"),tr("F:/"),"images(*.jpg *.png)");
    QPixmap pix(fileName);

    emit signalCreateLabel(pix);
}

通过action加载图片后在现有图片的基础上拖动图片进入到窗口,随着图片增加动态布局。
在拖动图片的时候存在一个问题,需要在构造函数中添加setAcceptDrops(true);才能接收拖动:

    setAcceptDrops(true);//不加此句,拖拽事件dragEnterEvent没有进去,无法实现拖拽
    connect(this,&MainWindow::signalCreateLabel,this,&MainWindow::slot_createLabel);
    m_widget = new QWidget;//主窗口中设置布局,必须创建qwidget,并将其设置为中心窗口,否则无法使用自己的布局
    setCentralWidget(m_widget);
    m_grid = new QGridLayout/*(this)*/;
    m_widget->setLayout(m_grid);

    m_count = 0;
    m_row = 0;

另外继承于qmainwindow的程序,要实现自己的布局,必须创建一个qwidget作为中心窗体,再在其上设置布局才能实现布局。qmainwindow具有自己默认的布局。

m_widget = new QWidget(this);//主窗口中设置布局,必须创建qwidget,并将其设置为中心窗口,否则无法使用自己的布局
setCentralWidget(m_widget);
m_grid = new QGridLayout;
m_widget->setLayout(m_grid);

以上代码只写出了重要部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值