最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt拖放操作和打印操作的實(shí)現(xiàn)

 更新時(shí)間:2022年04月14日 08:46:24   作者:MechMaster  
本文主要介紹了Qt拖放操作和打印操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1. 拖放操作

拖放操作分為 拖動(dòng)(Drag) 和 放下(Drop) 兩種操作,當(dāng)數(shù)據(jù)拖動(dòng)時(shí)會(huì)被存儲(chǔ)為 MIME(Multipurpose Internet Mail Extensions) 類型。

1.1 使用拖放打開文件(拖動(dòng).txt文件)

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

在這里插入圖片描述

頭文件函數(shù)聲明

    void dragEnterEvent(QDragEnterEvent *event);   //拖動(dòng)進(jìn)入事件
    void dropEvent(QDropEvent *event);             //放下事件

源文件函數(shù)實(shí)現(xiàn)

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

//拖動(dòng)進(jìn)入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())    //數(shù)據(jù)中是否包含URL
        event->acceptProposedAction();  //接收
    else
        event->ignore();                //忽略
}

//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData * mimeData = event->mimeData(); //獲取MIME數(shù)據(jù)
    if(mimeData->hasUrls())
    {
        QList<QUrl> urlList = mimeData->urls();
        QString fileName=urlList.at(0).toLocalFile();
        if(!fileName.isEmpty())
        {
            QFile file(fileName);   //建立QFile對(duì)象,以只讀方式打開文件
            if(!file.open(QIODevice::ReadOnly))
                return;
            QTextStream in(&file);      //建立文本流對(duì)象
            ui->textEdit->setText(in.readAll());
        }
    }
}

常用MIME類型數(shù)據(jù)處理函數(shù)

在這里插入圖片描述

1.2 自定義拖放操作(拖動(dòng)圖片)

在界面上任意拖動(dòng)這張圖片

圖片原來(lái)的位置蒙上黑色陰影效果

在這里插入圖片描述

頭文件函數(shù)聲明

protected:
    void mousePressEvent(QMouseEvent *event);       //鼠標(biāo)按下事件
    void dragEnterEvent(QDragEnterEvent *event);    //拖動(dòng)進(jìn)入事件
    void dragMoveEvent(QDragMoveEvent *event);      //拖動(dòng)事件
    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);                       //設(shè)置窗口部件可以接收拖入
    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);  //當(dāng)窗口關(guān)閉時(shí)銷毀圖片
}

MainWindow::~MainWindow()
{
    delete ui;
}

//鼠標(biāo)按下事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    //第1步:獲取圖片
    //將鼠標(biāo)指針?biāo)谖恢玫牟考?qiáng)制轉(zhuǎn)換為L(zhǎng)abel類型
    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);
    //將圖片信息,位置信息輸入到自己數(shù)組中
    dataStream<<pixmap<<QPoint(event->pos()-child->pos());

    //第3步:將數(shù)據(jù)放入QMimeData中
    QMimeData *mimeData = new QMimeData;
    //將字節(jié)數(shù)組放入QMimeData中,這里的MIME類型是我們自己定義的
    mimeData->setData("myimage/png",itemData);

    //第4步:將QMimeData數(shù)據(jù)放入QDrag中
    QDrag *drag = new QDrag(this);      //創(chuàng)建QDrag用來(lái)移動(dòng)數(shù)據(jù)
    drag->setMimeData(mimeData);
    drag->setPixmap(pixmap);            //在移動(dòng)過(guò)程中顯示圖片,若不設(shè)置則默認(rèn)顯示一個(gè)小矩形
    drag->setHotSpot(event->pos()-child->pos());    //拖動(dòng)時(shí)鼠標(biāo)指針的位置不變

    //第5步:給原圖添加陰影
    QPixmap tempPixmap = pixmap;
    QPainter painter;
    painter.begin(&tempPixmap);
    //在圖片的外接矩形中添加一層透明的淡黑色形成陰影效果
    painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
    painter.end();
    child->setPixmap(tempPixmap);       //在移動(dòng)圖片過(guò)程中,讓原圖片有一層黑色陰影

    //第6步:執(zhí)行拖放操作
    if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)
    {
        child->close();             //如果是移動(dòng)操作,那么拖放完成后關(guān)閉原標(biāo)簽
    }
    else
    {
        child->show();              //如果是復(fù)制操作,那么拖放完成后顯示標(biāo)簽
        child->setPixmap(pixmap);   //顯示原圖片,不再使用陰影
    }

}

//拖入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("myimage/png"))
    {
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    else
    {
        event->ignore();
    }
}

//拖動(dòng)事件
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);  //當(dāng)窗口關(guān)閉時(shí)銷毀圖片
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    else
    {
        event->ignore();
    }
}

2. 打印操作

  • Qt Print Support模塊提供了對(duì)打印的支持。
  • 只需要使用一個(gè)QPrinter 類 和 一個(gè) QPrintDialog 類 就可以完成文檔的打印操作。

在這里插入圖片描述

在這里插入圖片描述

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("打印預(yù)覽"),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;                         // 創(chuàng)建打印機(jī)對(duì)象
    QPrintDialog dlg(&printer, this);         // 創(chuàng)建打印對(duì)話框
    // 如果編輯器中有選中區(qū)域,則打印選中區(qū)域
    if (ui->textEdit->textCursor().hasSelection())
        dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
    if (dlg.exec() == QDialog::Accepted) {    // 如果在對(duì)話框中按下了打印按鈕
        ui->textEdit->print(&printer);        // 則執(zhí)行打印操作
    }
}

void MainWindow::doPrintPreview()                    // 打印預(yù)覽
{
    QPrinter printer;
    QPrintPreviewDialog preview(&printer, this);     // 創(chuàng)建打印預(yù)覽對(duì)話框
    // 當(dāng)要生成預(yù)覽頁(yè)面時(shí),發(fā)射paintRequested()信號(hào)
    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("導(dǎo)出PDF文件"),
                                                    QString(), "*.pdf");
    if (!fileName.isEmpty()) {
        if (QFileInfo(fileName).suffix().isEmpty())
            fileName.append(".pdf");        // 如果文件后綴為空,則默認(rèn)使用.pdf
        QPrinter printer;
        printer.setOutputFormat(QPrinter::PdfFormat);    // 指定輸出格式為pdf
        printer.setOutputFileName(fileName);
        ui->textEdit->print(&printer);
    }
}


3. 資源下載

qt_ck_jb51.rar

到此這篇關(guān)于Qt拖放操作和打印操作的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt拖放操作和打印操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++分離講解模板的概念與使用

    c++分離講解模板的概念與使用

    人們需要編寫多個(gè)形式和功能都相似的函數(shù),因此有了函數(shù)模板來(lái)減少重復(fù)勞動(dòng);人們也需要編寫多個(gè)形式和功能都相似的類,于是 C++ 引人了類模板的概念,編譯器從類模板可以自動(dòng)生成多個(gè)類,避免了程序員的重復(fù)勞動(dòng)
    2022-04-04
  • Qt讀寫ini文件的方法詳解(含源碼+注釋)

    Qt讀寫ini文件的方法詳解(含源碼+注釋)

    .ini文件是Initialization?File的縮寫,即初始化文件,下面這篇文章主要給大家介紹了關(guān)于Qt讀寫ini文件(含源碼+注釋)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    本篇文章是對(duì)使用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù),用實(shí)例進(jìn)行了分析說(shuō)明,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)推箱子小游戲

    C++實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Qt實(shí)現(xiàn)編寫SMTP客戶端的示例詳解

    Qt實(shí)現(xiàn)編寫SMTP客戶端的示例詳解

    這篇文章主要介紹了如何通過(guò)Qt實(shí)現(xiàn)編寫SMTP客戶端,可以實(shí)現(xiàn)通過(guò)SMTP發(fā)送電子郵件(有文本,html,附件,內(nèi)聯(lián)文件等的MIME)。并支持SSL和SMTP身份驗(yàn)證,感興趣的可以學(xué)習(xí)一下
    2022-11-11
  • C語(yǔ)言示例代碼講解棧與隊(duì)列

    C語(yǔ)言示例代碼講解棧與隊(duì)列

    棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊(duì)列實(shí)現(xiàn)棧與用棧實(shí)現(xiàn)隊(duì)列
    2022-05-05
  • C++深度優(yōu)先搜索的實(shí)現(xiàn)方法

    C++深度優(yōu)先搜索的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++深度優(yōu)先搜索的實(shí)現(xiàn)方法,是數(shù)據(jù)結(jié)構(gòu)中非常重要的一種算法,需要的朋友可以參考下
    2014-08-08
  • Opencv檢測(cè)多個(gè)圓形(霍夫圓檢測(cè),輪廓面積篩選)

    Opencv檢測(cè)多個(gè)圓形(霍夫圓檢測(cè),輪廓面積篩選)

    本文主要介紹了Opencv檢測(cè)多個(gè)圓形(霍夫圓檢測(cè),輪廓面積篩選),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C++開發(fā)之PugiXML庫(kù)基礎(chǔ)用法示例詳解

    C++開發(fā)之PugiXML庫(kù)基礎(chǔ)用法示例詳解

    PugiXML庫(kù)是一個(gè)功能強(qiáng)大、簡(jiǎn)單易用的C++ XML解析庫(kù),它提供了一組方便的函數(shù)來(lái)解析、創(chuàng)建和修改XML文檔,本文介紹了如何使用PugiXML庫(kù)來(lái)解析、創(chuàng)建和修改XML文檔,以及如何處理錯(cuò)誤和異常,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Flutter應(yīng)用Windows平臺(tái)接入實(shí)踐詳解

    Flutter應(yīng)用Windows平臺(tái)接入實(shí)踐詳解

    這篇文章主要為大家介紹了Flutter應(yīng)用Windows平臺(tái)接入實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

贵州省| 修武县| 天津市| 苍溪县| 古交市| 东乌珠穆沁旗| 台东县| 屏南县| 祁门县| 南阳市| 鄂州市| 大方县| 洱源县| 乌鲁木齐市| 沙洋县| 南陵县| 海林市| 昌黎县| 横山县| 华阴市| 西平县| 太和县| 霍城县| 桂东县| 辽宁省| 阳山县| 南汇区| 宜兰市| 方城县| 麻阳| 呈贡县| 三穗县| 内乡县| 左云县| 资中县| 丹阳市| 勐海县| 东阿县| 综艺| 东至县| 青川县|