【问题标题】:Getting font metrics without GUI (console mode)在没有 GUI 的情况下获取字体度量(控制台模式)
【发布时间】:2015-07-30 19:44:05
【问题描述】:

假设某些图像必须由 Qt 控制台程序生成,并且内部算法需要 字体度量(它们使用 文本宽度/高度作为输入计算应该出现的位置)。该程序必须能够在没有任何 GUI 的 Linux 上运行(运行级别 3,基本上是一个没有任何显示服务器的集群)。

问题: QFontMetrics 仅在以 GUI 模式运行 Qt 应用程序时可用。
在没有任何显示服务器的情况下获取字符串指标的任何解决方法?

【问题讨论】:

  • 确实,当尝试使用没有附加应用程序的 QFont 时,它会抛出“QGuiApplication::font() 中的 ASSERT 失败:“没有 QGuiApplication 实例”。我知道这不是一个理想的解决方案,但您可以创建一个虚拟应用程序并将其用作字体的“容器”。只是不要执行应用程序(app.exec()),而是在使用后将其删除。
  • 您需要gui 模块,但您不需要实际的UI。可能您还需要QApplication 对象(不是QCoreApplication),但您不必创建任何小部件。
  • 是的,但是当没有显示服务器时 QApplication 会调用 exit(1)...
  • @MarekR 这就是我的意思,创建 QApplication 但根本不执行它。您应该可以正常访问它的成员。

标签: qt qt4 console-application fontmetrics


【解决方案1】:

好吧,在额外的 cmets 之后,我想我明白你的问题了。 就这样做吧:

include <QApplication>

int main(int argv, char **args)
{
    QApplication app(argv, args);
    QApplication::processEvents(); // this should allow `QApplication` to complete its initialization

    // do here whatever you need 

    return 0; // or some other value to report errors
}

您也可以尝试使用QGuiApplication 这个版本不需要(不使用)小部件。

另请参阅example in documentation 如何处理无 gui 案例。


这段代码在我的带有 Qt 5.3 的 Ubnutu 上完美运行
#include <QGuiApplication>
#include <QFontMetrics>
#include <QDebug>

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

    QFont font("Times", 10, QFont::Bold);
    qDebug() << font;
    QFontMetrics metrics(font);

    qDebug() << metrics.boundingRect("test");

    return 0;
}

当使用QApplication 时,它也适用于 Qt 4.8。

项目文件很简单

QT       += core
TARGET = MetricsNoGui
TEMPLATE = app
SOURCES += main.cpp

【讨论】:

  • 好吧,恐怕我给你赏金太快了!哈哈。它似乎有效,但实际上,如果您取消设置 DISPLAY var env(在您调用该程序的终端中),它仍然会崩溃:“QXcbConnection: Could not connect to display\n Aborted (core dumped)”
  • :( 当使用无效的DISPLAY var 运行时对我也不起作用:DISPLAY=:99 ./MetricsNoGui 错误为Could not load the Qt platform plugin "xcb"。它只适用于有效的DISPLAY .
【解决方案2】:

Qt 4.8 有such QApplication 构造函数,它的第三个参数可以帮助解决这个问题。简单地提供 false 作为第三个参数,并享受在 Qt 控制台应用程序中使用 QFontMetrics。如果在没有 X 服务器的系统上启动应用程序,不会发生崩溃。

【讨论】:

    【解决方案3】:

    我没有找到将QFontQPrinterQCoreApplication 一起使用的方法:( 但是,如果您能够安装Xvfb,那么您的QApplication 也可以在没有的服务器上运行任何显示器。我在无头 Raspberry Pi Zero 上使用此设置。

    Xvfb :1 -screen 0 1024x768x16 &
    export DISPLAY=:1.0
    ./YourQApplication
    

    这不是最优雅的解决方案,但经过数小时的绝望搜索,这是我找到的唯一一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2023-03-24
      • 2021-09-29
      • 2011-10-16
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多