Je vais écrire un programme utilisant Qt pour certains traitements d’image et je veux qu’il puisse s’exécuter en mode non-gui (mode démon?). Je suis inspiré par le lecteur VLC, qui est un programme “généralement” d’interface graphique, dans lequel vous pouvez le configurer à l’aide d’une interface graphique, mais vous pouvez également l’exécuter dans non-gui
option non-gui
graphique lorsqu’il fonctionne sans interface graphique. Ensuite, il utilise un fichier de configuration créé en mode graphique.
La question est comment devrait être une telle conception de programme? Devrait-il y avoir un kernel de programme, indépendant de l’interface graphique et dépendant d’options, connecté à l’interface graphique?
Oui, vous pouvez utiliser une option “headless” ou “gui” pour le binary en utilisant QCommandLineParser . Notez qu’il n’est disponible qu’à partir de la version 5.3, mais que le chemin de la migration est assez fluide dans la série majeure si vous ne l’utilisez toujours pas.
#include #include #include #include #include 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(QSsortingngList() << "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.
Vous pouvez passer un argument à votre application lorsque vous commencez à afficher en mode graphique ou non. Par exemple, si vous passez le paramètre -non-gui lors de l’exécution en ligne de commande, l’application ne doit pas afficher la fenêtre principale et doit effectuer d’autres opérations:
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(); }