Qt文本框(QTextEdit)输入拖动输入图片和读取图片

9 篇文章 1 订阅

最近在学习开发聊天软件的过程中想要模仿一下微信拖动图片到文本输入框中显示并能够发送的逻辑。经过查阅资料发现可以通过重写Qt的QTextEdit中的dropevent事件来实现。dropevent事件代码如下:

void MyEdit::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasUrls())
    {
        auto urls = event->mimeData()->urls();
        if (urls.size() > 0)
        {
            for (auto& url : urls)
            {
                QFileInfo info(url.toLocalFile());
                if (QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1()))
                {
                    QTextDocument * textDocument = this->document();
                    QImage image = QImageReader(url.toString()).read();
                    textDocument->addResource(QTextDocument::ImageResource, url, QVariant(image));
                    QTextCursor cursor = this->textCursor();
                    QTextImageFormat imageFormat;
                    imageFormat.setWidth(80);
                    imageFormat.setHeight(50);
                    imageFormat.setName(url.toString());
                    cursor.insertImage(imageFormat);
                }
            }
        }
    }
    event->accept();
}

我们拖动图片释放之后会得到一个对应的文件url,如果拖动多个文件则会有多个url对于每个url我们进行相应的判断,如果是图片的话,则将其转换为图片,并通过textCursor()获取到鼠标当前所在的位置,进而将其插入到对应位置。需注意程序不能已管理员身份运行,否则会因windows限制导致程序无法捕获到drop事件。

实际效果如下所示图:

而想要从文本框中获取图片则可以使用一下代码。

其中QTextDocument是文本对象,通过其可以获取文本块(QTextBlock)。也可以获取到框架(QTextFrame)表格(QTextTable)列表(QTextList)等,但在本文这里无需获取上述内容。输入框中可能有多个文本块,回车或换行就会产生一个新的文本块,我们遍历文本块中的内容,如果遇到了图片,则可以通过下述方式获取其相关内容,其中的name就是图片路径,后续的网络发送或其他操作都可以通过这个路径进行。

void testTextImage::onSignalGet()
{
    QTextDocument* document = ui.textEdit->document();
    QTextBlock block = document->begin();
    while (block.isValid())
    {
        for (auto iter = block.begin(); iter != block.end(); ++iter)
        {
            QTextCharFormat format = iter.fragment().charFormat();
            bool isImage = format.isImageFormat();
            if (isImage)
            {
                auto imageFormat = format.toImageFormat();
                auto name = imageFormat.name();
                auto type = document->resource(QTextDocument::ImageResource, imageFormat.name()).typeName();
            }
        }
        block = block.next();
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现给图片添加文本框输入的水印,可以通过以下步骤来实现: 1. 在Qt中创建一个新的QWidget窗口。 2. 在QWidget窗口中添加一个QLabel用于显示图片。 3. 在QLabel上叠加一个QTextEdit用于输入文本。 4. 实现将QTextEdit中的文本作为水印添加到原始图片上的功能。 下面是一个简单的代码示例: ```cpp // 添加QWidget窗口 QWidget *widget = new QWidget(this); setCentralWidget(widget); // 添加QLabel用于显示图片 QLabel *label = new QLabel(widget); QPixmap pixmap("image.png"); label->setPixmap(pixmap); label->setFixedSize(pixmap.size()); // 添加QTextEdit用于输入文本 QTextEdit *textEdit = new QTextEdit(widget); textEdit->setFixedSize(200, 50); textEdit->move(10, 10); // 添加按钮,在按钮点击时将文本作为水印添加到原始图片上 QPushButton *button = new QPushButton("Add Watermark", widget); button->move(10, 70); connect(button, &QPushButton::clicked, [label, textEdit]() { QPixmap pixmap = label->pixmap()->copy(); QPainter painter(&pixmap); painter.setPen(Qt::white); painter.setFont(QFont("Arial", 20)); painter.drawText(10, 40, textEdit->toPlainText()); label->setPixmap(pixmap); }); ``` 在这个示例中,我们创建了一个QWidget窗口,并在该窗口上添加了一个QLabel用于显示图片,以及一个QTextEdit用于输入文本。当用户点击"Add Watermark"按钮时,我们将QTextEdit中的文本作为水印添加到原始图片上,并将结果显示在QLabel上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值