Как де-GUI сложное приложение tanglewad C ++ / Qt4? - PullRequest
4 голосов
/ 16 апреля 2011

У нас есть большое грязное приложение, написанное на C ++ и Qt4, много библиотечных зависимостей, сотни классов и нет единой структуры.Обычно он запускается как приложение с графическим интерфейсом, управляемое в интерактивном режиме, но иногда оно запускается незаметно для другой программы, которая передает ему параметры командной строки и связывается с ним через dbus.Графический интерфейс все еще показывает, но нет человека или обученной обезьяны, чтобы щелкнуть что-нибудь."Relaxen und watch das blinkenlights" В интерактивном или автоматическом режиме при запуске приложение записывает файлы изображений.

Моя работа на следующие несколько недель - добавить функцию «без графического интерфейса», чтобы приложение могло работать в автоматическом режиме и записывать файлы изображений, даже не показывая свой графический интерфейс.Внутренне изображения, которые должны быть написаны, создаются с использованием QImage и других объектов Qt, не относящихся к GUI, но они принадлежат другим объектам, которые включают в себя классы GUI Qt.После нескольких попыток понять беспорядок, я не могу найти способ распутать вещи, такие как заставить приложение создавать образы без полного полнофункционального графического интерфейса.Одно время я надеялся, что смогу просто установить xxx.visible = false;для всех xxx, которые являются объектами GUI, но это не практично или невозможно (AFIK).

Существуют ли какие-либо общие стратегии для добавления этой функции без графического интерфейса в это приложение?Какой-то метод, который не потребует глубокого изменения иерархии классов?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Долгий и трудный путь - выяснить, что и как выполняется логика, извлечь логику в некоторые классы на основе QObject (с сигналами и слотами) и сделать это приложение QtCore. Я знаю, что это не помогает, но это способ correct.

Если установка всех элементов графического интерфейса на скрытый (или, возможно, только QMainWindow?) Не является опцией, это единственное, что вы можете сделать.

Qt позволяет вам делать это, но если исходный кодер не планировал это, у вас много работы по рефакторингу / перекодированию.

1 голос
/ 16 апреля 2011

Это действительно зависит от того, как написана программа.Если логика несколько отделена от интерфейса, то это может быть так же просто, как выяснить, какой класс наследуется от класса QMainWindow и убедиться, что он никогда не инициализируется.

В случае, когда логика полностьюя настоятельно рекомендовал бы попытаться привести всю логику в форму signal или slot (что, вероятно, уже произошло, учитывая, что это приложение с графическим интерфейсом), а затем просто не инициализировать экземпляр QMainWindow ивызывая их вручную.

0 голосов
/ 16 апреля 2011

Попробуйте создать подклассы интерфейсных классов (QMainWindow, QDialog и т. Д.) И реализовать свою логику там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...