问题是这样的程序应该如何设计?是否应该有一个程序核心,它与GUI界面无关,并根据选项与GUI界面进行连接?
是的,您可以使用QCommandLineParser来使用“无头”或“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.
lable.startSomeProcess()
怎么办? - d21d3qmain.c
中创建(并显示)MainWindow
,并在其中实现整个程序的情况。我想我明白了 - 我应该像往常一样制作它,但不显示它? - d21d3q当启动应用程序时,您可以传递一个参数以在GUI或非GUI模式下显示。例如,如果在命令行中运行时传递了-nongui参数,则应用程序不应显示主窗口,并且应该执行一些其他操作:
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上面的例子对我没用,因为我得到了
Original Answer
作为错误信息。
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
然而,结果可能会有所不同。那里的例子对我也没有“立即生效”!
我必须使用命令行参数,然后选择两种运行方法之一。每种方法都创建了自己的应用程序对象(QCoreApplication用于无头,QApplication用于GUI,如文档所示),然后运行该应用程序。
可能是因为我正在使用“主要是Qt 4”代码并在Qt 5上编译,所以事情有点奇怪,但这种方法现在有效,因此我没有进一步调查。
使用Qt5,在命令行参数-platform offscreen
下运行Qt应用程序会绘制离屏。
请参阅文档https://doc.qt.io/qt-5/qguiapplication.html#QGuiApplication
当前支持的选项如下:
-platform platformName[:options],指定Qt平台抽象(QPA)插件。
覆盖QT_QPA_PLATFORM环境变量。
支持的平台名称在platformName文档中列出。
已测试使用Qt 5.15.1