【问题标题】:QPainter.drawText() SIGSEGV Segmentation faultQPainter.drawText() SIGSEGV 分割错误
【发布时间】:2014-11-30 01:50:59
【问题描述】:

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

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

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

有人知道为什么会抛出这个错误“SIGSEGV Segmentation fault”吗?

谢谢。

【问题讨论】:

    标签: c++ printing qt5 segmentation-fault


    【解决方案1】:

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

    这在QPaintDevice 文档中有记录:

    警告: 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();
    }
    

    【讨论】:

    • 是的,这似乎有效。不知道需要先加载 Qt GUI 组件。谢谢你。还有一件事(请原谅我是 Qt 的新手)“请注意,至少在基于 Linux 的系统上,屏幕外 QPA 在这里不起作用。”是什么意思?
    • Qt 有不同平台的概念,即使是在同一个操作系统上。有例如用于普通 linux 桌面的 xcb QPA,以及 eglfs 和其他一些。然后是offscreen,如果您没有图形 UI 但需要 QGuiApplication,这基本上是一个 QPA。但是,使用 -platform offscreenQT_QPA_PLATFORM=offscreen 将无法解决此问题,因为它需要一些在屏幕外不可用的资源(字体配置等),至少在 Linux 中是这样。
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多