QPainter.drawText()SIGSEGV分段错误

Fáb*_*nes 5 c++ printing segmentation-fault qt5

我正在尝试通过Qt5打印方法在热敏打印机中打印一条简单的文本消息。

#include <QCoreApplication>
#include <QDebug>
#include <QtPrintSupport/QPrinterInfo>
#include <QtPrintSupport/QPrinter>
#include <QtGui/QPainter>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   QPrinter printer(QPrinter::ScreenResolution);
   QPainter painter;
   painter.begin(&printer);
   painter.setFont(QFont("Tahoma",8));
   painter.drawText(0,0,"Test");
   painter.end();

   return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我通过调试器运行它时,会SIGSEGV Segmentation fault在该drawText方法上收到信号。

打印机已连接,安装,当我打电话时,qDebug() << printer.printerName();我得到了应该使用的打印机的正确名称。

有人知道为什么会引发此错误SIGSEGV Segmentation fault吗?

谢谢。

dom*_*om0 5

为了QPrinter工作,您需要一个QGuiApplication,而不是一个QCoreApplication.

这记录在QPaintDevice文档中:

警告: Qt 要求QGuiApplication在创建任何绘制设备之前对象存在。绘制设备访问窗口系统资源,这些资源在创建应用程序对象之前不会被初始化。

请注意,至少在基于 Linux 的系统上,offscreenQPA 在这里不起作用。

#include <QCoreApplication>
#include <QDebug>
#include <QtPrintSupport/QPrinterInfo>
#include <QtPrintSupport/QPrinter>
#include <QtGui/QPainter>
#include <QGuiApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
  QGuiApplication a(argc, argv);

  QPrinter printer;//(QPrinter::ScreenResolution);

  // the initializer above is not the crash reason, i just don't
  // have a printer
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setOutputFileName("nw.pdf");

  Q_ASSERT(printer.isValid());

  QPainter painter;
  painter.begin(&printer);
  painter.setFont(QFont("Tahoma",8));
  painter.drawText(0,0,"Test");
  painter.end();

  QTimer::singleShot(0, QCoreApplication::instance(), SLOT(quit()));

  return a.exec();
}
Run Code Online (Sandbox Code Playgroud)