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