开发者

How to de-GUI a complex tanglewad C++/Qt4 app?

开发者 https://www.devze.com 2023-02-26 20:47 出处:网络
We have a large messy app written in C++ and Qt4, many library dependencies, hundreds of classes and no coherent structure.It normally runs a开发者_StackOverflow中文版s a GUI app manipulated interacti

We have a large messy app written in C++ and Qt4, many library dependencies, hundreds of classes and no coherent structure. It normally runs a开发者_StackOverflow中文版s a GUI app manipulated interactively, but sometimes it's launched in a hands-off way from another program that feeds it command line options and communicates with it by dbus. The GUI still shows, but no human or trained monkey is there to click anything. "Relaxen und watch das blinkenlights" Whether interactively or automatically, when run the app writes image files.

My job the next few weeks is to add an "no gui" feature, such that the app can run in the hands-off way and write its image files, without ever showing its GUI. Internally, the images to be written are made using QImage and other non-GUI Qt objects, but these are possessed by other objects that do involve the GUI classes of Qt. After several attempts to understand the mess, I cannot find a way to disentangle things such as to have the app create images w/o the whole full-blown GUI running. At one time, I was hoping I could just set xxx.visible= false; for all xxx that are GUI objects, but this is not practical or possible (AFIK).

Are there any general strategies to follow to add this no-gui feature to this app? Some technique that won't require deep redesign of the class hierarchy?


The long and hard way is finding out what and how the logic is executed, extract the logic to some QObject based classes (with signals and slots) and make it a QtCore app. I know this doesn't help, but that's the correct way.

If setting all GUI elements to hidden (or perhaps only the QMainWindow?) is not an option, this is the only thing you can do.

Qt allows you to do this, but if the original coder did not plan this in, you've got a lot of refactoring/recoding to do.


This really depends on how the program is written. If the logic is somewhat seperated from the interface, then it could be as simple as finding out what class inherits from the QMainWindow class and making sure that is never initialised.

In the case where the logic is all over the place, I'd strongly suggest trying to get all the logic into a form of signal or slot (which has probably already happened considering that it's a GUI app), then just not initialising the QMainWindow instance and calling these manually.


Try to subclass interface classes (QMainWindow, QDialog, etc), and implement your logic there.

0

精彩评论

暂无评论...
验证码 换一张
取 消