QT::自定义事件

 

自定义事件:鼠标拖动一个图片,原图片变为阴影,图片跟着鼠标用,鼠标放下,图片放下,原图消失。

 

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

 

ui->setupUi(this);
// 设置窗口部件可以接收拖入
setAcceptDrops(true);
// 创建标签
QLabel *label = new QLabel(this);
QPixmap pix("../xx.png");
// 添加图片
label->setPixmap(pix);
// 设置标签大小为图片的大小
label->resize(pix.size());
label->move(100,100);
// 当窗口关闭时销毁图片
label->setAttribute(Qt::WA_DeleteOnClose);

 

鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    /*****第一步:获取图片******/

    // 将鼠标指针所在位置的部件强制转换为QLabel类型
    QLabel *child = static_cast<QLabel *>(childAt(event->pos()));
    // 如果部件不是QLabel则直接返回
    if(!child->inherits("QLabel")) 
            return;
    // 获取QLabel中的图片
    QPixmap pixmap = *child->pixmap();

    /*****第二步:自定义MIME类型******/
    // 创建字节数组
    QByteArray itemData;
    // 创建数据流
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    // 将图片信息,位置信息输入到字节数组中
    dataStream << pixmap << QPoint(event->pos() - child->pos());


    /*****第三步:将数据放入QMimeData中******/
    // 创建QMimeData,它用来存放要移动的数据
    QMimeData *mimeData = new QMimeData;
    // 将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的
    mimeData->setData("myimage/png", itemData);


    /*****第四步:将QMimeData数据放入QDrag中******/
    // 创建QDrag,它用来移动数据
    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    // 在移动过程中显示图片,若不设置则默认显示一个小矩形
    drag->setPixmap(pixmap);
    // 拖动时鼠标指针的位置不变
    drag->setHotSpot(event->pos() - child->pos());

    /*****第五步:给原图片添加阴影******/

    // 使原图片添加阴影
    QPixmap tempPixmap = pixmap;
    // 创建QPainter,用来绘制QPixmap
    QPainter painter;
    painter.begin(&tempPixmap);
    // 在图片的外接矩形中添加一层透明的淡黑色形成阴影效果
    painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
    painter.end();
    // 在移动图片过程中,让原图片添加一层黑色阴影
    child->setPixmap(tempPixmap);

    /*****第六步:执行拖放操作******/
    // 设置拖放可以是移动和复制操作,默认是复制操作
    // 如果是移动操作,那么拖放完成后关闭原标签
    if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction)== Qt::MoveAction)
          child->close();
    // 如果是复制操作,那么拖放完成后显示标签
    // 显示原图片,不再使用阴影
    else 
    {
        child->show();
        child->setPixmap(pixmap);
    }
}

 

拖动进入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
     // 如果有我们定义的MIME类型数据,则进行移动操作
     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");

         // 使用数据流将字节数组中的数据读入到QPixmap和QPoint变量中
         QDataStream dataStream(&itemData, QIODevice::ReadOnly);
         QPixmap pixmap;
         QPoint offset;
         dataStream >> pixmap >> offset;

         // 新建标签,为其添加图片,并根据图片大小设置标签的大小
         QLabel *newLabel = new QLabel(this);
         newLabel->setPixmap(pixmap);
         newLabel->resize(pixmap.size());

         // 让图片移动到放下的位置,不设置的话,图片会默认显示在(0,0)点即窗口左上角
         newLabel->move(event->pos() - offset);
         newLabel->show();
         newLabel->setAttribute(Qt::WA_DeleteOnClose);

         event->setDropAction(Qt::MoveAction);
         event->accept();
     } 
     else 
    {
         event->ignore();
    }
}

 

 自定义打印事件

void doPrint();
void doPrintPreview();
void printPreview(QPrinter *printer);
void createPdf();

 

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);

 

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,SIGNAL(paintRequested(QPrinter*)),
                this,SLOT(printPreview(QPrinter*)));                  

    preview.exec();
}

 

void MainWindow::printPreview(QPrinter *printer)
{
    ui->textEdit->print(printer);
}

 

// 生成PDF文件
void MainWindow::createPdf()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"),QString(), "*.pdf");
    if (!fileName.isEmpty()) 
    {
        // 如果文件后缀为空,则默认使用.pdf
        if (QFileInfo(fileName).suffix().isEmpty())
            fileName.append(".pdf");

        QPrinter printer;
        // 指定输出格式为pdf
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOutputFileName(fileName);
        ui->textEdit->print(&printer);
    }
}

 

posted @ 2021-01-29 00:02  osbreak  阅读(328)  评论(0编辑  收藏  举报