【问题标题】:Qt grab widget and save imageQt 抓取小部件并保存图像
【发布时间】:2021-06-08 15:59:51
【问题描述】:

我有以下问题。我想抓取一个小部件并将其保存为图像。我想将它保存为 png、jpeg 和 tiff。我写了以下代码:

QString s =  QFileDialog::getSaveFileName(this, "Save as", "Choose a filename", "PNG(*.png);; TIFF(*.tiff *.tif);; JPEG(*.jpg *.jpeg)");

std::string current_string = s.toLocal8Bit().constData();
//current_string = current_string + ".png";

char * buffer = new char[current_string.length()];
std::string temp = buffer;
char* temp2 = &temp[0];
strcpy(buffer, current_string.c_str());

char* pch = strtok (temp2,".");
pch = strtok (NULL, ".");


if(!QPixmap::grabWindow(m_widget->winId()).save(buffer,pch))
{
    QMessageBox::warning(this, "File could not be saved", "ok", QMessageBox::Ok);
}

这在我的笔记本电脑上运行良好。当我进行 Visual Studio 设置时,它在我的笔记本电脑上也可以正常工作,但是当我将它安装在另一台电脑上时,png 格式可以正常工作(保存正确的图像),但无法保存 jpeg 和 tif。然后我在另一台电脑上尝试了它,但我直接在 Visual Studio 中使用项目文件进行了尝试。那里有我的电脑等所有项目设置,并且 jpeg 和 tif 不起作用。 PNG 有效,但它只在该电脑上保存一个白色图像。此外,我还在那里尝试了安装文件及其相同的 PNG = 白色图像。

谁能帮帮我?

【问题讨论】:

  • 你需要图片插件,例如这个问题:stackoverflow.com/questions/2241141/…
  • 我已经尝试复制exe文件夹中的4个dll。但它也不起作用。当我在 Visual Studio 调试模式下尝试它时,它也无法解释为什么在一台电脑上 png 图像是白色的,以及为什么它不能保存 jpeg 和 png 文件。 ?

标签: c++ qt


【解决方案1】:

这是将小部件另存为图像的最简单方法。这种方法适用于 Qt 5:

ui->myWidget->grab().save("image.png");

Qt 文档:

【讨论】:

  • 不错的简短答案 - 可以通过添加指向文档的链接及其内容的一些摘要/描述(因为链接消失或移动)来改进它 - 例如您所在的文档的部分或版本找到了参考。欢迎来到 SO。
【解决方案2】:

插件不是直接进入应用程序的EXE文件夹,而是应用程序文件夹下的一个“插件”文件夹。我还必须将它放在“imageformats”文件夹中,而不是“plugins”中至少一次,我相信。那可能是不同的平台/特殊版本。

对于 Windows,请参阅此 Qt deployment guide

此外,您的“new char[]”调用可能最终会崩溃。您需要为空字符预留空间:

char * buffer = new char[current_string.length() + 1];

另外,你不需要所有的 std::string 东西来获得扩展。随着时间的推移,这可能会令人沮丧。

QString saveFilename = QFileDialog::getSaveFileName(this, "Save as", "Choose a filename", "PNG(*.png);; TIFF(*.tiff *.tif);; JPEG(*.jpg *.jpeg)");

QString saveExtension = "PNG";
int pos = saveFilename.lastIndexOf('.');
if (pos >= 0)
    saveExtension = saveFilename.mid(pos + 1);

if(!QPixmap::grabWidget(m_widget).save(saveFilename, qPrintable(saveExtension)))
{
    // since you have a widget, just use grabWidget() here. winId() would possibly have
    // portability issues on other platforms.  qPrintable(saveExtension) is effectively
    // the same as saveExtension.toLocal8Bit().constData()

    QMessageBox::warning(this, "File could not be saved", "ok", QMessageBox::Ok);
}

【讨论】:

  • 非常感谢您的回答。这行得通。但我仍然有一个问题,即在 5 台电脑上抓取窗口可以工作,而在一台电脑上它会保存一张白色图像。
  • 嗯..奇怪。那台电脑有什么不同吗? (不同的显卡、显卡驱动版本、操作系统……?)
  • 这是一个 Nvidia GTX470。其他 PC 也是 Nvidia,其中一台有 AMD 卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多