此例实现将图片拖动到窗口中展示,并实现随着图片个数整体的布局也发生变化。
主要代码如下:
拖动进入事件
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);
以上代码只写出了重要部分。