假设某些图像必须由 Qt 控制台程序生成,并且内部算法需要字体度量(它们使用文本宽度/高度作为输入来计算应发生绘图的位置)。该程序必须可以在没有任何 GUI 的 Linux 上运行(运行级别 3,基本上是一个没有任何显示服务器的集群)。
问题: QFontMetrics 仅在以 GUI 模式运行 Qt 应用程序时可用。
在没有任何显示服务器的情况下获取字符串指标的任何解决方法?
假设某些图像必须由 Qt 控制台程序生成,并且内部算法需要字体度量(它们使用文本宽度/高度作为输入来计算应发生绘图的位置)。该程序必须可以在没有任何 GUI 的 Linux 上运行(运行级别 3,基本上是一个没有任何显示服务器的集群)。
问题: QFontMetrics 仅在以 GUI 模式运行 Qt 应用程序时可用。
在没有任何显示服务器的情况下获取字符串指标的任何解决方法?
好的,经过额外的评论,我想我理解你的问题。就这样做:
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
此版本不需要(不使用)小部件。
另请参阅文档中的示例如何处理无 gui 案例。
#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;
}
使用时它也适用于 Qt 4.8 QApplication
。
项目文件非常简单
QT += core
TARGET = MetricsNoGui
TEMPLATE = app
SOURCES += main.cpp
Qt 4.8 有这样的 QApplication 构造函数,它的第三个参数可以帮助解决这个问题。简单地提供 false 作为第三个参数,并享受在 Qt 控制台应用程序中使用 QFontMetrics。如果在没有 X 服务器的系统上启动应用程序,则不会发生崩溃。
我没有找到使用QFont
或QPrinter
使用的方法QCoreApplication
:(但是,如果您能够安装Xvfb,那么您QApplication
也可以在没有任何显示器的服务器上运行。我在无头 Raspberry Pi 零上使用此设置。
Xvfb :1 -screen 0 1024x768x16 &
export DISPLAY=:1.0
./YourQApplication
这不是最优雅的解决方案,但经过数小时的绝望搜索,它是我找到的唯一一个。