目录
  • 1. 拖放操作
    • 1.1 使用拖放打开文件(拖动.txt文件)
    • 1.2 自定义拖放操作(拖动图片)
  • 2. 打印操作
    • 3. 资源下载

      1. 拖放操作

      拖放操作分为 拖动(Drag) 和 放下(Drop) 两种操作,当数据拖动时会被存储为 MIME(Multipurpose Internet Mail Extensions) 类型。

      1.1 使用拖放打开文件(拖动.txt文件)

      下面完成将 .txt文件 拖如界面里的操作。

      Qt拖放操作和打印操作的实现

      头文件函数声明

          void dragEnterEvent(QDragEnterEvent *event);   //拖动进入事件
          void dropEvent(QDropEvent *event);             //放下事件
      

      源文件函数实现

      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include <QDragEnterEvent>
      #include <QUrl>
      #include <QFile>
      #include <QTextStream>
      #include <QMimeData>
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          setAcceptDrops(true); //假如这行代码后,主窗口就可以接收放下事件了
      }
      
      MainWindow::~MainWindow()
      {
          delete ui;
      }
      
      //拖动进入事件
      void MainWindow::dragEnterEvent(QDragEnterEvent *event)
      {
          if(event->mimeData()->hasUrls())    //数据中是否包含URL
              event->acceptProposedAction();  //接收
          else
              event->ignore();                //忽略
      }
      
      //放下事件
      void MainWindow::dropEvent(QDropEvent *event)
      {
          const QMimeData * mimeData = event->mimeData(); //获取MIME数据
          if(mimeData->hasUrls())
          {
              QList<QUrl> urlList = mimeData->urls();
              QString fileName=urlList.at(0).toLocalFile();
              if(!fileName.isEmpty())
              {
                  QFile file(fileName);   //建立QFile对象,以只读方式打开文件
                  if(!file.open(QIODevice::ReadOnly))
                      return;
                  QTextStream in(&file);      //建立文本流对象
                  ui->textEdit->setText(in.readAll());
              }
          }
      }
      
      

      常用MIME类型数据处理函数

      Qt拖放操作和打印操作的实现

      1.2 自定义拖放操作(拖动图片)

      在界面上任意拖动这张图片

      图片原来的位置蒙上黑色阴影效果

      Qt拖放操作和打印操作的实现

      头文件函数声明

      protected:
          void mousePressEvent(QMouseEvent *event);       //鼠标按下事件
          void dragEnterEvent(QDragEnterEvent *event);    //拖动进入事件
          void dragMoveEvent(QDragMoveEvent *event);      //拖动事件
          void dropEvent(QDropEvent *event);              //放下事件
      

      编辑源文件

      #include "mainwindow.h"
      #include <QLabel>
      #include "ui_mainwindow.h"
      #include <QMouseEvent>
      #include <QDrag>
      #include <QDragEnterEvent>
      #include <QDragMoveEvent>
      #include <QDropEvent>
      #include <QPainter>
      #include <QMimeData>
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          setAcceptDrops(true);                       //设置窗口部件可以接收拖入
          QLabel * label = new QLabel(this);
          QPixmap pix("..//imagedragdrop/logo.png");
          label->setPixmap(pix);
          label->resize(pix.size());
          label->move(100,100);
          label->setAttribute(Qt::WA_DeleteOnClose);  //当窗口关闭时销毁图片
      }
      
      MainWindow::~MainWindow()
      {
          delete ui;
      }
      
      //鼠标按下事件
      void MainWindow::mousePressEvent(QMouseEvent *event)
      {
          //第1步:获取图片
          //将鼠标指针所在位置的部件强制转换为Label类型
          QLabel * child = static_cast<QLabel *>(childAt(event->pos()));
          if(!child->inherits("QLabel"))
              return;
          QPixmap pixmap = *child->pixmap();
      
          //第2步:自定义MIME类型
          QByteArray itemData;
          QDataStream dataStream(&itemData,QIODevice::WriteOnly);
          //将图片信息,位置信息输入到自己数组中
          dataStream<<pixmap<<QPoint(event->pos()-child->pos());
      
          //第3步:将数据放入QMimeData中
          QMimeData *mimeData = new QMimeData;
          //将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的
          mimeData->setData("myimage/png",itemData);
      
          //第4步:将QMimeData数据放入QDrag中
          QDrag *drag = new QDrag(this);      //创建QDrag用来移动数据
          drag->setMimeData(mimeData);
          drag->setPixmap(pixmap);            //在移动过程中显示图片,若不设置则默认显示一个小矩形
          drag->setHotSpot(event->pos()-child->pos());    //拖动时鼠标指针的位置不变
      
          //第5步:给原图添加阴影
          QPixmap tempPixmap = pixmap;
          QPainter painter;
          painter.begin(&tempPixmap);
          //在图片的外接矩形中添加一层透明的淡黑色形成阴影效果
          painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
          painter.end();
          child->setPixmap(tempPixmap);       //在移动图片过程中,让原图片有一层黑色阴影
      
          //第6步:执行拖放操作
          if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)
          {
              child->close();             //如果是移动操作,那么拖放完成后关闭原标签
          }
          else
          {
              child->show();              //如果是复制操作,那么拖放完成后显示标签
              child->setPixmap(pixmap);   //显示原图片,不再使用阴影
          }
      
      }
      
      //拖入事件
      void MainWindow::dragEnterEvent(QDragEnterEvent *event)
      {
          if(event->mimeData()->hasFormat("myimage/png"))
          {
              event->setDropAction(Qt::MoveAction);
              event->accept();
          }
          else
          {
              event->ignore();
          }
      }
      
      //拖动事件
      void MainWindow::dragMoveEvent(QDragMoveEvent *event)
      {
          if(event->mimeData()->hasFormat("myimage/png"))
          {
              event->setDropAction(Qt::MoveAction);
              event->accept();
          }
          else
          {
              event->ignore();
          }
      }
      
      //放下事件
      void MainWindow::dropEvent(QDropEvent *event)
      {
          if(event->mimeData()->hasFormat("myimage/png"))
          {
              QByteArray itemData = event->mimeData()->data("myimage/png");
              QDataStream dataStream(&itemData,QIODevice::ReadOnly);
              QPixmap pixmap;
              QPoint offset;
              dataStream>>pixmap>>offset;
              QLabel * newLabel = new QLabel(this);
              newLabel->setPixmap(pixmap);
              newLabel->resize(pixmap.size());
              newLabel->move(event->pos()-offset);
              newLabel->show();
              newLabel->setAttribute(Qt::WA_DeleteOnClose);  //当窗口关闭时销毁图片
              event->setDropAction(Qt::MoveAction);
              event->accept();
          }
          else
          {
              event->ignore();
          }
      }
      
      

      2. 打印操作

      • Qt Print Support模块提供了对打印的支持。
      • 只需要使用一个QPrinter 类 和 一个 QPrintDialog 类 就可以完成文档的打印操作。

      Qt拖放操作和打印操作的实现

      Qt拖放操作和打印操作的实现

      myprint.pro文件

      QT += printsupport
      

      头文件

      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      
      #include <QMainWindow>
      class QPrinter;
      
      namespace Ui {
      class MainWindow;
      }
      
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      
      public:
          explicit MainWindow(QWidget *parent = 0);
          ~MainWindow();
      
      private:
          Ui::MainWindow *ui;
      
      private slots:
          void doPrint();
          void doPrintPreview();
          void printPreview(QPrinter *printer);
          void createPdf();
      
      };
      
      #endif // MAINWINDOW_H
      
      

      源文件

      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include <QPrinter>
      #include <QPrintDialog>
      #include <QPrintPreviewDialog>
      #include <QFileDialog>
      #include <QFileInfo>
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
      
          QAction *action_print = new QAction(tr("打印"),this);
          QAction *action_printPreview = new QAction(tr("打印预览"),this);
          QAction *action_pdf = new QAction(tr("生成pdf"),this);
          connect(action_print,SIGNAL(triggered()),this,SLOT(doPrint()));
          connect(action_printPreview,SIGNAL(triggered()),this,SLOT(doPrintPreview()));
          connect(action_pdf,SIGNAL(triggered()),this,SLOT(createPdf()));
          ui->mainToolBar->addAction(action_print);
          ui->mainToolBar->addAction(action_printPreview);
          ui->mainToolBar->addAction(action_pdf);
      
      }
      
      MainWindow::~MainWindow()
      {
          delete ui;
      }
      
      void MainWindow::doPrint()                    // 打印
      {
          QPrinter printer;                         // 创建打印机对象
          QPrintDialog dlg(&printer, this);         // 创建打印对话框
          // 如果编辑器中有选中区域,则打印选中区域
          if (ui->textEdit->textCursor().hasSelection())
              dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
          if (dlg.exec() == QDialog::Accepted) {    // 如果在对话框中按下了打印按钮
              ui->textEdit->print(&printer);        // 则执行打印操作
          }
      }
      
      void MainWindow::doPrintPreview()                    // 打印预览
      {
          QPrinter printer;
          QPrintPreviewDialog preview(&printer, this);     // 创建打印预览对话框
          // 当要生成预览页面时,发射paintRequested()信号
          connect(&preview, &QPrintPreviewDialog::paintRequested,
                  this, &MainWindow::printPreview);
          preview.exec();
      }
      
      void MainWindow::printPreview(QPrinter *printer)
      {
          ui->textEdit->print(printer);
      }
      
      void MainWindow::createPdf()                // 生成PDF文件
      {
          QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"),
                                                          QString(), "*.pdf");
          if (!fileName.isEmpty()) {
              if (QFileInfo(fileName).suffix().isEmpty())
                  fileName.append(".pdf");        // 如果文件后缀为空,则默认使用.pdf
              QPrinter printer;
              printer.setOutputFormat(QPrinter::PdfFormat);    // 指定输出格式为pdf
              printer.setOutputFileName(fileName);
              ui->textEdit->print(&printer);
          }
      }
      
      
      

      3. 资源下载

      qt_ck_jb51.rar

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。