Я собираюсь написать программу, использующую Qt для обработки изображений, и хочу, чтобы она могла работать в режиме без графического интерфейса (в режиме демона?). Я вдохновлен проигрывателем VLC, который является «типично» программой с графическим интерфейсом, где вы можете настроить его с помощью графического интерфейса, но вы также можете запустить его в non-gui
вариант, когда он работает без графического интерфейса. Затем он использует файл конфигурации, созданный в режиме графического интерфейса.
Вопрос в том, каким должен быть такой дизайн программы? Должно ли быть какое-то ядро программы, которое не зависит от графического интерфейса и в зависимости от параметров подключается к интерфейсу GUI?
Да, вы можете использовать опцию «без головы» или «GUI» для двоичного файла, используя QCommandLineParser. Обратите внимание, что он доступен только в версии 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.
Вы можете передать аргумент своему приложению, когда начинаете показывать в графическом или не графическом режимах. Например, если вы передаете параметр -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();
}