Qt应用程序与可选的gui
Qt application with optional gui
我将使用Qt编写一些图像处理程序,我希望它能够在非gui模式(守护模式?)下运行。我受到VLC播放器的启发,这是"典型的"GUI程序,您可以使用GUI配置它,但当它没有GUI运行时,您也可以在non-gui
选项中运行它。然后它使用一些在GUI模式下创建的配置文件。
问题是这样的程序应该如何设计?应该是一些程序核心,这是GUI独立的,取决于选项,它正在与GUI界面连接?
是的,您可以使用QCommandLineParser为二进制文件使用"headless"或"gui"选项。请注意,它仅从5.3版本开始可用,但是如果您仍然不使用主系列,那么迁移路径在主系列中是相当平滑的。
main.cpp
#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();
}
main.pro
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();
}
上面的例子对我不起作用,因为我得到
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细节
但是,您的情况可能会有所不同。这里的例子并没有"仅仅"起作用"对我来说也是!
我必须使用命令行arg,然后从两个方法中选择一个来运行。每个方法都创建了自己的应用对象(如文档所示,QCoreApplication用于headless, QApplication用于GUI),然后运行应用程序。
这可能是因为我的工作"主要是Qt "在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测试
- GCP 或 AWS 是否支持 C++ 和 GUI 应用程序开发?
- 多线程Windows GUI应用程序中的死锁
- 为什么在Visual Studio中用c ++编写GUI应用程序的代码与控制台应用程序的代码不同?
- 如何使用Visual Studio 2017和Qt开发GUI应用程序?
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- QTCreator GUI应用程序中包含窗口基源代码并在代码中打开
- Qt GUI应用程序在与GUI交互时停止实时进程
- 如何将QT GUI应用程序的版本打印到主机上
- 您如何从已经运行的GUI应用程序中启动使用GUI的可执行文件
- QT 4.x/5.x和OpenGL用于桌面GUI应用程序:选择哪种模块
- Qt Gui 应用程序部署
- 在非GUI应用程序,优点和缺点中使用QT
- 使用 Qt 的简单线程 gui 应用程序的结构是什么?
- 如何将命令行插入 GUI 应用程序
- 如何在QT GUI应用程序中进行正确的线程处理
- Qt Creator中的Qt GUI应用程序构建设置
- 编译或运行PyQT4 GUI应用程序时,排除(或禁用)log4clus警告
- 在 Linux/Windows 上使用 c++ 的 GUI 应用程序
- cv::imshow在GUI应用程序运行时阻塞线程
- 如何在Qt GUI应用程序中嵌入输出控制台窗口