我将使用 Qt 编写程序进行一些图像处理,并且我希望它能够在非 gui 模式(守护程序模式?)下运行。我受到 VLC 播放器的启发,它是“典型的”GUI 程序,您可以使用 GUI 对其进行配置,但您也可以在non-gui
没有 GUI 的情况下运行它。然后它使用在 GUI 模式下创建的一些配置文件。
问题是这样的程序应该怎么设计?应该是一些程序核心,它独立于 GUI 并取决于它与 GUI 界面连接的选项?
我将使用 Qt 编写程序进行一些图像处理,并且我希望它能够在非 gui 模式(守护程序模式?)下运行。我受到 VLC 播放器的启发,它是“典型的”GUI 程序,您可以使用 GUI 对其进行配置,但您也可以在non-gui
没有 GUI 的情况下运行它。然后它使用在 GUI 模式下创建的一些配置文件。
问题是这样的程序应该怎么设计?应该是一些程序核心,它独立于 GUI 并取决于它与 GUI 界面连接的选项?
是的,您可以使用QCommandLineParser对二进制文件使用“headless”或“gui”选项。请注意,它仅从 5.3 开始可用,但如果您仍然不使用它,则在主要系列中迁移路径非常顺利。
#include <QApplication>
#include <QLabel>
#include <QDebug>
#include <QCommandLineParser>
#include <QCommandLineOption>
int main(int argc, char **argv)
{
QApplication application(argc, argv);
QCommandLineParser parser;
parser.setApplicationDescription("My program");
parser.addHelpOption();
parser.addVersionOption();
// A boolean option for running it via GUI (--gui)
QCommandLineOption guiOption(QStringList() << "gui", "Running it via GUI.");
parser.addOption(guiOption);
// Process the actual command line arguments given by the user
parser.process(application);
QLabel label("Runninig in GUI mode");
if (parser.isSet(guiOption))
label.show();
else
qDebug() << "Running in headless mode";
return application.exec();
}
TEMPLATE = app
TARGET = main
QT += widgets
SOURCES += main.cpp
qmake && make && ./main
qmake && make && ./main --gui
Usage: ./main [options]
My program
Options:
-h, --help Displays this help.
-v, --version Displays version information.
--gui Running it via GUI.
当开始以 gui 或非 gui 模式显示时,您可以将参数传递给您的应用程序。例如,如果您在命令行中运行时传递 -non-gui 参数,则应用程序不应该显示主窗口,它应该做一些其他的事情:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
bool GUIMode=true;
int num = qApp->argc() ;
for ( int i = 0; i < num; i++ )
{
QString s = qApp->argv()[i] ;
if ( s.startsWith( "-non-gui" ) )
GUIMode = false;
}
if(GUIMode)
{
w.show();
}
else
{
//start some non gui functions
}
return a.exec();
}
上面 lpapp 的示例对我不起作用,因为我得到了
qt.qpa.screen: QXcbConnection: Could not connect to display localhost:10.0
Could not connect to any X display.
在没有 X 显示的情况下运行时(DISPLAY 的任何值,而不仅仅是localhost:10.0
)。
有一个解决方法 -export QT_QPA_PLATFORM='offscreen'
但这不是命令行选项,您的用户应该这样做,这不是很好。
因此,在此处发布问题后,进一步的研究将我引导至以下 QT5 文档,该文档解释了根据命令行选项使用或不使用 GUI 的“已批准”启动方式:
https://doc.qt.io/qt-5/qapplication.html#details
但是,您的里程可能会有所不同。那里的例子对我来说也不是“刚刚工作”!
我必须使用命令行 arg 然后选择两种方法之一来运行。每个方法创建自己的应用程序对象(QCoreApplication 用于无头,QApplication 用于 GUI,如文档所示),然后运行应用程序。
可能是因为我正在使用“主要是 Qt 4”代码并在 Qt 5 上编译,所以事情有点奇怪,但这种方法现在有效,所以我没有进一步调查。
使用 Qt5,使用命令行参数运行 Qt 应用程序-platform offscreen
确实会画出屏幕外。
请参阅文档https://doc.qt.io/qt-5/qguiapplication.html#QGuiApplication
当前支持的选项如下:
-platform platformName [:options],指定Qt 平台抽象(QPA) 插件。
覆盖 QT_QPA_PLATFORM 环境变量。
支持的平台名称列在platformName docs中。
用 Qt 5.15.1 测试