Use a single source file for many QtDesigner forms - qt

I couldn't find my answer in the Qt documentation (maybe I'm inept), so here's a simple question:
Should I have separate source and header files for every QtDesigner form I have in my project, or can I (and should I) design all the GUI forms and then define their functionality in a single source and header file?
Consider this is a relatively simple project with ~5 forms based around a main window.

Qt Designer files has class generation definitions. UIC generates QWidget/QMainWindow based classes from them. You can use these classes from single class using aggregation method. But i don't recommend this if you don't know what to do.
My advice is to use it as Qt way. Use seperate classes and seperate files for each form. This approach is better. Every form should need its members and MainWindow can arrange communications (signal/slot connections and other logic) for these forms.

Related

multiple forms on MainWindow.ui using Qt creator

how do I put the time, date and company logo on the top of all my Qt forms?
I don't want to redo this same code in all my classes.
I thought I could create 1 class with a stacked widget for the date, time and logo and then call (add) this to all other classes.
I'm not sure how to do this.
In QML, you would generally put the common code in a base class and subclass it to create children that might have values to certain fields that are different - but the same common fields. I use this technique to generate different modes in the same app that might need slightly different toolbars but the same canvas.
You might want to write the ui code in c++ for widgets, and then go from there.
Another approach might be to set the common values inside a model, and use those common values across the board.

Qt Quick Dynamically Custom Layouts (like workspaces in an IDE)

The project I'm working on calls for workspace layouts for a large section of it, by which I mean that users can move around panes, resize them, close them, etc., like in VSCode (but more like Emacs since VSCode does not currently support both vertical and horizontal splitting).
The current methodology I'm considering to create a custom LayoutManager that has a json object and injects views into recursive Row and Column objects in a binary-tree-like structure. Before I start this undertaking, I'm wondering if there is a library or set of QtQuick (QML) elements that would let me do this a lot more easily or if there is a better approach to this problem. Or, please just tell me why I'm wrong in doing it this way.
Note: The technologies I'm using are C++ with Qt 5 (currently 5.10).
If you want highly customizable GUI, with the option of persisting UI configuration, it is best to design the whole thing model driven.
QML already has the necessary stuff - list views, repeaters and so on. QML is a little at odds with tree models, but you can essentially fake a tree by using lists of lists.
The model provided here will do the trick, with the added benefit it also supports declarative instantiation. So you can easily set up an initial GUI state declaratively, like you would with normal QML, but then allow the user to make modifications to that initial state which can then be saved and recalled.
Then all you have to do is bind the desired GUI elements to the underlying model data source objects.

Qt GUI in designer or in code?

When it comes to designing a GUI in Qt, I am hesitating between using the designer in Qt Creator, or doing everything in source code. I'm using Qt widgets and not QML.
If I use the designer I can easily create a GUI using qt standard widgets. But as soon as I need to subclass a widget to extend its functionality I have to build a Designer plugin to support my new widget. Is that correct? Or is there another way to it?
You can build all the GUI in Designer including custom widgets, and you can also build your custom widgets in Designer.
Designer does not need to interpret your custom widgets. Just use the promote functionality. With promote, you start with a plain widget within Designer and then tell the "real" class of it (your custom one) and the header file where it is decleared. The only drawback is that within Designer, it will stay looking like an empty widget.
In my experience, it is much better to use Designer for the GUI than writing source code yourself. You can easily change all the properties afterwards etc., and it is helpful even if you rely on custom widgets. Source code is not a good declarative language for GUI objects, with all the properties etc. Also you cannot play around, you would need to compile all the time just to tell "Is it better to have this text label in bold font?".
Sometimes I edit the XML files that are created by Designer by hand. For example, if I want to put a widget somewhere else in the object tree. If you don't mess up the XML, Designer will still read it and not destroy your changes. The only reason I see for writing GUI in source code is when you have repetitive elements, or dynamic changes based on data input, e.g. a for()-loop that produces elements. In my project I have some Selector Boxes that are filled with options in the source code.
And btw: If you prefer to write your GUI in code instead of using Designer, maybe you are not the right person to craft the GUI. Most programmers don't understand that while they are technically able to design a GUI, they are not always also competent in doing it.
http://hallofshame.gp.co.at/index.php?file=shame.htm&mode=original
It is a bit of a shortcut, but I often use a simple QWidget as a container for my custom widget. This way, I can setup sizing policies, put the whole thing in the layout I want before my custom widget is even in. Then, in C++, I add the custom widget as a child of the container widget.
edit: As ypnos mentioned you can promote the placeholder directly. You can find guidelines here

Good reference for editing Qt .ui files?

At times I find myself editing the XML files on Qt creator rather than using the drag and drop interface for example if I can't get my widgets in the correct row of my grid layout. Is there a good reference anywhere on how to lay UIs out using XML? For example, I'd been interested in altering the visibility of a checkbox in the XML rather than in C++ code... is this doable, or am I too much in the WPF mindset? Either way, I'd still be interested in that reference.
You may find the Qt Designer's UI File Format page useful.
I generally just use the designer to prototype something quickly, and then code it up in C++ once the design is correct. Breaking the UI up into custom widgets, rather than one massive form often produces something more manageable.
I've been using Qt for 4 years but I never modified the UI files directly. I always do it using Qt Designer. Not sure why you ever need to modify the XML file directly.
This is not answer to your question, but I believe you're missing how to use Qt Designer. Please check Qt Designer's Manual first.

flex newbie: can MXML be generated on the fly

Flex newbie question: can MXML be generated on the fly, like HTML is generated by a server?
If yes, is it ok to do so or am I missing an important Flex architectural principle.
Sort of... but it still needs to be compiled. MXML is not rendered directly, it is first compiled into ActionScript 3.0, and then into a typical SWF... so, you cannot serve your users with MXML. However, like almost all programmming languages, you can use automatic code generation to ease development tasks.
There is IIS/Apache component given by adobe that can generate your mxml -> html+swf using on the fly compilation, and it also caches the last compiled file.
However its not recommended for bigger projects as it has certain problems that you cant make libraries of your code and organize code accordingly. Namespace usage is very limited.
MXML is just a way of describing user interface layout and scripts. This information is then "compiled" into ActionScript, then converted to SWF format for use in the Flash player.
So, yes, you can generate MXML on the fly, in that you can create a text file that contains valid MXML syntax, then use mxmlc to compile it, but there's no way (that I'm aware of) to create MXML and "add" it to your current movie such that the information appears as it would were it compiled.
It is not officially supported but there is a few similar projects doing stuff similar to this.
as3Query let you create things with xml.
Using createComponentFromDescriptor() maybe can get what you want.
Should be more as I remember, but can't find it out at this moment... Searching for "MXML runtime dynamic compilation" or something like that should be helpful...

Resources