QPainter.drawText()SIGSEGV分段错误

时间:2014-10-05 17:47:38

标签: c++ printing qt5 sigsegv

我试图通过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();
}

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

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

任何人都知道为什么会抛出此错误&#34; SIGSEGV Segmentation fault&#34;?

谢谢。

1 个答案:

答案 0 :(得分:4)

QPrinter工作,您需要QGuiApplication,而不是QCoreApplication

QPaintDevice docs:

中记录了这一点
  

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

请注意,至少在基于Linux的系统上,offscreen QPA在此处不起作用。

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