I am writing a program using the Qt framework. I would like the user to be able to have access to a console/terminal from within the application itself.
In other words, the user should be greeted with a "BASH" prompt when they start the program.
I have looked into QTermWidget, but there doesn't seem to be too much documentation on it and it doesn't seem to be up to date either.
I've looked at QConsole, but it only seems to be able to run TCL/Python consoles.
How would I be able to embed a terminal into my application?
There is really not much tutorial needed for QTermWidget, although there is one here.
The purpose of the widget is that it does not require any complication. The code would be something like this without the extra settings:
QTermWidget *console = new QTermWidget();
QMainWindow *mainWindow = new QMainWindow();
mainWindow->setCentralWidget(console);
It is also not necessarily true that it is not up-to-date. It was recently updated to build against Qt 5 properly. If you lack anything, please use the issue tracker on github.
It should be more or less in mature and "complete" state, that is why you may not see heavy progress. It is just a widget after all, not a big framework.
You could try QProcess. This is not strictly "embedding" a terminal in your app, but it it really easy to use, you can kick off a terminal that is owned by your app. You can even connect (with signals / slots) to its output and interact with it in a limited fashion... depends on what you need.
Here is the doc with some simple examples: http://qt-project.org/doc/qt-5/QProcess.html
I am not at my Qt-PC today so I don't have an "interacting" example for you, but if you think this is a way for you to go then I can dig that out...
Related
I'm currently trying to develop a proof of concept for a possible idea but am unsure if this is even possible.
We have application A, written in wxPython, which will not receive any code updates. It's too late in its life and will impact too many people. In a specific case which we wish to automatic - a GUI window pops up asking user to select an option from the list.
We want to develop script or "application B" which listens for this GUI to pop up and automatically makes the choice. It can be a script that runs in the background at all times.
Now.. from my understanding I don't think it's possible without some interprocess communication going on. Since we cannot change anything in application A the problem seems unsolvable. Any ideas? Am I missing something about how I could use wxPython?
I'd like to run commands and show the output in quite a few Ubuntu Touch apps I'd like to create, so therefore I need to create a plugin for QML in C/C++(?) with this functionality.
The thing is that I don't know anything about C/C++, nor do I really want to learn it. However I do need it now and I need help to get going.
How would I create this plugin? Where do I start?
Thanks in advance,
Daniel
You can always wrap QProcess which allows you to run any shell command.
Check this out
And for Ubuntu touch you can use wizard for qml plugins. Its quite easy actually.
I got help from Joseph Mills: https://code.launchpad.net/~josephjamesmills/+junk/launchTotem
You shall use PlasmaCore.DataSource with the engine "executable", as in this example.
Mind that the call is asynchronous. Hence the command sends a signal when it finishes, and a different part of the code picks the signal and continues with the next step you want to perform.
I am a beginner is C++. I am trying to find, is it possible to run my program in both in QT window and Linux based. When the user logins into my system, the user can select GUI or terminal mode to run the system.
Thus, I would like to know is it possible to do it. If possible how can I proceed on? What command should I use to switch from a QT window to a terminal?
Do I need to create a separate set of project for both individually or using the same set of classes?
All Linux programs (unless explicitly disabled) print out text to a terminal. If you run the program in a graphical environment you will probably not run it from a console, therefore you won't see the output, but it will be still there.
If you want your program to be usable from a console, just test whether you could create the main window and if not, fallback to simple text output.
Note that the binary will still require the X server and Qt libraries to be installed.
You can construct your application with or without the GUI enabled through the QApplication constructor. Consult the example in Qt's documentation:
http://qt-project.org/doc/qt-4.8/qapplication.html#QApplication-2
Though, it should be noted that everything in Let_Me_Be's response is correct. In fact, the Qt example does exactly what he's suggesting. Please take the time to understand his answer before you plunge into coding.
We have a large messy app written in C++ and Qt4, many library dependencies, hundreds of classes and no coherent structure. It normally runs as 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.
I'm looking to add an element to my wxWidgets GUI that behaves like a terminal emulator. Not in terms of a shell which executes commands, but just the input-output setup of an application running in a terminal.
Basically, the requirements are:
Streaming input/output: When you enter a character, it is added to an input stream, and when something is piped to the terminal, it prints out immediately.
No editing: Once you type in a character, it's permanently there, since it's probably been consumed by the application running in the terminal.
Some sort of scrolling (even if it just shows a few lines or something).
It would be nice if there is something that already does this, but suggestions on how to implement this with already existing controls such as wxTextCtrl would also be welcome.
I know this is a couple weeks late, but hopefully it's still useful. I've got a project called Chameleon that uses a wxWidgets-based VT100 terminal widget, which was itself based off of a project called taTelnet. The Chameleon source is available from my website (download page here). Not sure if it's exactly what you're looking for, but it might give you some ideas. Feel free to let me know if you have any questions about it.
wxWidgets supports redirecting STDOUT to a wxTextCtrl via wxStreamToTextRedirector. As for input, you could override the OnChar event in a wxTextCtrl-derived class to handle this.