本节将编写一个可以通过拖拽显示图片的例程:
- 在 Qt Creator 中创建一个 Qt Widgets Application, 并命名为ImageViewer。
- 切换 Creator 到设计模式,拖拽一个 QLabel 到窗口中。在窗口中的空白处单击,按下ctrl +G 快捷键将控件按grid分布。这能够保证窗口中的所有内容都会随窗口尺寸进行缩放。
- 点击所拖拽的 Label 并将 alignment/Horizontal 属性 设置为 ALignHCenter, 并将 HorizontalPolicy(水平策略) 和 VerticalsizePolicy 垂直策略设置为 Ignored。接下来,将下列头文件包含到 mainwindow.h 文件中:
#include <QPixmap> #include <QDragEnterEvent> #include <QDropEvent> #include <QMimeData> #include <QFileInfo> #include <QMessageBox> #include <QResizeEvent>
- 添加下列 protected 函数声明到 MainWindow 类中(mainwindow.h 文件)
protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); void resizeEvent(QResizeEvent *event);
添加一个private QPixmap 到 mainwindow.h 文件
添加下列函数定义到 mainwindow.cpp文件QPixmap pixmap;
运行程序。void MainWindow::dragEnterEvent(QDragEnterEvent *event) { QStringList acceptedFileTypes; acceptedFileTypes.append("jpg"); acceptedFileTypes.append("png"); acceptedFileTypes.append("bmp"); if (event->mimeData()->hasUrls() && event->mimeData()->urls().count() == 1) { QFileInfo file(event->mimeData()->urls().at(0).toLocalFile()); if(acceptedFileTypes.contains(file.suffix().toLower())) { event->acceptProposedAction(); } } } void MainWindow::dropEvent(QDropEvent *event) { QFileInfo file(event->mimeData()->urls().at(0).toLocalFile()); if(pixmap.load(file.absoluteFilePath())) { ui->label->setPixmap(pixmap.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } else { QMessageBox::critical(this, tr("Error"), tr("The image file cannot be read!")); } } void MainWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); if(!pixmap.isNull()) { ui->label->setPixmap(pixmap.scaled(ui->label->width()-5, ui->label->height()-5, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } }
- 这个程序的基本功能是接收一张拖拽过来的图片并显示。注意,必须添加 setAcceptDrops(true), 否则将不会接收拖拽文件。