zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    软件编程思想读后感
    上交所历史数据分析系统项目总结
    2013学习总结----JavaScript
    快来领取你专属的css背景图案
    小朋友,听说你还不会css中的条纹背景?
    特殊要求下的背景定位的解决方案
    css中多边框实现的方式
    一个按钮样式测试出你的 css功力
    一次优雅的表单验证设计
    使用JavaScript浅谈组合模式
  • 原文地址:https://www.cnblogs.com/osbreak/p/14342659.html
Copyright © 2011-2022 走看看