How to make a C++ GUI program in Qt Creator 5.7 that is only 1 window, but every click makes the window have other elements- like a setup wizard [closed] - c++

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
I started making GUI Apps with Qt 5.7 around 2 weeks ago.
Until today I have made a BlackJack game, a basic mini encryption program and 1-2 more programs. Now, I could find any help on how to make an application that actually acts like a Setup Wizard- by that I mean, for example by clicking on next, a label or any elements are gone and new one appera like a progress bar and below the contents that are copied. How is that actually done?
Is it something like on_pushButton_clicked() and afterwards the usless elements are hidden like ui->pushButton->hide(); and others show up, or is it literally made by practically "rebuilding" the window with other elements and functionalities?

Edit: Mike's comment revealing the existence of QWizard and QWizardPage makes my answer quite redundant, unless you have requirements exceeding the abilities of those widgets - or simply want to implement everything yourself - which the OP has replied that they do want to try. For everyone else, you might only need to read on if you need - or want! - to do all the heavy lifting.
One way to do that is, as you pondered, to destroy the old contents (child widgets) of the window after each page, then repopulate it for the next.
But that's far from ideal IMO: it's wasteful, and it would require you to repeatedly destroy/rebuild things, with all the jumping around that entails, to support Back/Next/Jump to Page # buttons and all routes between different pages. That's more programming and more use of resources to keep unnecessarily tearing down and rebuilding stuff.
Your other idea about hiding is better, and I know exactly the container for this job! With this, you can build everything in advance and won't need to repeatedly remove/add children to change pages (as you would e.g. if you used a QGridLayout).
Give your window a single child of the container class QStackedWidget. This container takes multiple child widgets but shows only one at a time. So:
Add to it a child container for each page of your wizard.
Populate each child with required widgets for that page.
Connect buttons, etc in each page to signals to do required actions...
...especially your Back/Next (and Jump, or whatever) buttons. Set these up so that they change the active child of the QStackedWidget by using the Slot setCurrentIndex().
This way, you build the entire stack of all pages, ready to go, before ever showing the window. Then, when ready, you just show it, and everything is present and ready. Your signals, all properly connected, will take care of everything else: changing between pages, validating input, revealing labels or opening dialogs warning about missing information, etc.

Related

what are the commands executed in every click in windows? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
As some suggested, I'm trying to minimize the question and get out of the web. That web example was not exactly what I wanted. I simply wanted to make a macro. Like if a condition is true open date settings and change the date to December 2000. If false, open time settings. How can I program to do this? Do I need to execute some commands in command prompt window to do it? If yes what are they? Actually, I want to make a macro that will do a lot of work in just on click.
as far as I know, eveything we do in computer or windows just executes a series of commands depending on the input of mouse and keyboard. So, I want to know if it is possible to know what commands are being executed in background. Actually, I want to make a macro in my program. As for example, a program that will go to google, search for a word and download the first imahe that comes from the search. If, it is possible to know then how.
[I could have searched in google. but I just couldn't guess what keywords to use in the search. so, I posted here. I am sorry if it has already been dicussed]
These click-related commands are really related to the GUI system. These 'commands' figure out what type of click, where on the screen it occurred, etc. After all that, some function to do the work will start executing, which is completely unique to the program, rather than the GUI.
Program that leverage other programs do not got through the GUI, and therefore can skip all of that. They instead use API's to directly access the functionality that is accessed by the sequence of events triggered by a mouse click.
The web is not my area of focus, so I do not have a reliable suggestion for how you would accomplish this, but the takeaway is this: Don't strive to understand the underlying technology by tracing mouse clicks. The GUI is an abstraction from what is really going on "under the hood," and is rarely an effective segue into the underlying mechanisms of a program.
Searching for "image search API" would be a good place to start.

Get one file's name method - Customize the interface - Microsoft Visual Studio 2010 [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 9 years ago.
Improve this question
I'm looking for some guide for Microsoft Visual Studio 2010, but I can't find nothing useful.
I'm coding in c++.
What I need is to create a button (in the dialog box) that, when I click on it, gives me the possibility to choose a file from my pc.
After that, I only need to charge in memory (like in a string variable nameFile) the name of this file.
Do anyone know how to do this operation?
And second problem, do you guys know any youtube guide or similar to customize the interface??
Like to put one picture on the background of the application, or change button style etc.
I used Eclipse before, coding in Java and It was totally different.
Thank you all!!
Here is an MFC tutorial for adding a button to a dialog and what has to be done to "wire it up" so that clicking the button invokes an event handler for the BN_CLICKED event.
Inside the BN_CLICKED event handler (that is, the function that is called when you click the button), you'll want to launch the dialog that lets you selecte the file. #Jongware suggested this link, which has a couple of approaches.
Once the file has been selected and the dialog disappears, you'll have access to the string containing the selected file. How you do this will depend on which approach you take in the preceding step. Once you have the string, you can use the appropriate File Management functions to slice-and-dice the file name as necessary.
That's far short of the actual code you'll need to write, I know, but it should give you enough of a start to get going. HTH.

How to design a Web application in django for mobile devices (phones / tablets) [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 9 years ago.
Improve this question
Is it possible to analyse the clients browser and serve a special designed layout for mobile devices?
In addition how to implement some fancy widgets usable on mobile-devices like "dropdown" and other things like date/time choices and so on? Not to forget the Style and art of whiping from one sceen to the next in smartphone or tablet way - How goes that?
I'm new on this kind of app/web - development, so any hint would be fine.
Conclusion so far: Use a Responsive Webdesign like bootstrap to address issues concernig small screens and changing aspect ratios and something like jQuery as Toolbox for Widgets.
The concrete question now ist how to implement all this into a 0815 'django app'?
I would suggest you to give a chance to Twitter Bootstrap http://getbootstrap.com/
It's becoming more and more popular when it comes to development of responsive web sites.
They recently realeased new version (Bootstrap 3) which is really great and it helps you to easily control what and how to disply on specific screen size.
If you want to learn more about it you could also visit this youtube channel http://www.youtube.com/user/CodersGuide?feature=watch
Well you can certainly make a list of common browser strings and create custom layouts for browsers most common on Android/iOS and serve those directly. (not preferred)
However the generally preferred method is to use CSS media queries for responsive web. These queries look something like:
#media screen and (min-device-width:321px)
{
...
}
#media screen and (min-width:769px)
{
...
}
#media screen and (min-width:1025px)
{
...
}
And in those locations where it says ... you can do custom classes/positioning/styling for all your elements. But Google is your friend in finding good tutorials for these.
Also there are many CSS/JavaScript libraries out there to create good buttons/layouts for mobile devices. These libraries often take into account that the touch areas for buttons need to be larger then the visible area, that there is enough spacing between elements. Often they also include "mobile" widgets, e.g. fancy dialog selectors that pop open and look just like the native popups on iOS or Android. Once again Google will be your friend.
If however you find yourself forced to do browser string comparisons don't expect your guess at the device to be correct. Browser strings are quite tricky and don't reveal a lot of information of the device. E.g. you may have no idea if the visitor is using Chrome for Android on a tablet or a smartphone. You can use browser strings to determine if the user is on Android or iOS for instance. But for Android don't expect to be able to identify all possible screensizes/devices on the market from the browserstrings.

Need to add anchoring/docking to legacy MFC dialog application

I am working with MFC code that I believe was developed in the early 90's. I've been given the great task of bringing the software into the 21st century, getting it to work on the likes of Windows 7/8. The application targets numerous platforms, of which one is Windows XP. The original software had a fixed window size and looks terrible on certain OS. I have managed to overcome this but sizing the dialog leaves a lot of grey space. I need to incorporate anchors and docking, similar to .NET.
As always, time is limited, so I need quick, "dirty" solutions, until I get time to rewrite the UI layer. The application contains a number of "screens", each following a similar format. Banner at the top, content consisting of copyright, help on the LHS and task buttons on the RHS and a kind of footer control containing "hotkeys".
As a quick fix, I am thinking that resizing the dialog should cause the following.
Banner is anchored left and right
LHS/RHS content is split say 60/40
Footer is as per the banner
This is made more difficult as different controls are used for different target operating systems/platforms. Basically, the OnInitDialog, uses conditional compilation to to add controls, dynamically, depending on the platform.
To implement this I am guessing I need something like the following...
Each control "remembers" its bounds
I expect this to be tricky as no WM_CREATE message for dialog child controls.
Possibly use OnParentNotify.
Sizing the dialog "remembers" its last size and calculates differences in width and height.
The dialog sends a parent resize message to its immediate children so they can re-calculate layout.
My question, finally, is what is the best way to approach this?
One idea I have...
Introduce a new Widget class that extends CWnd and returns anchor details via a virtual method.
Create controls such as CBanner, CCopyright, CFooter etc that implement Widget
Create a RowWidget for content that sizes LHS and RHS content appropriately.
Now that was hard to put into words!
Any help appreciated.
Thanks
Karl
Actually a very common question and your reasoning is sound, but rather than reinventing the wheel, it might be better to first look at some freely available implementations along the lines you describe.
For example this CodeProject article does what I think you need.

Creating a professional-looking (and behaving!) form designer

When I began programming (some 10+ years ago), three things amazed me:
Compilers/interpreters (back then I knew them as "programs that make my programs work", often followed by the qualifier "whatever they are")
Code editors
Form designers
Back then, I accepted all of them as facts of life. I was able to make my own special-purpose programs, but "programs that made my programs work", code editors and form editors were made by the Gods and there was no way I could mess with them.
Then I went to university, and took a course on formal language processing. After learning formal grammars, parsers, abstract syntax trees, etc.; all the magic about compilers, interpreters and code editors was soon gone. Compilers and interpreters could be written in sane and simple ways, and the only non-sane thing a syntax highlighting code editor could require were Windows API hacks.
However, to this day, form editors remain a mystery to me. Either I lack the technical knowledge required to make a form designer, or I have such knowledge, but cannot find a way to use it to implement a form designer.
Using Visual C++ and the MFC, I would like to implement a form designer inspired by the best form designer ever:
In particular, I would like to imitate its two features that I like the most:
The form being designed is inside a container. Thus, an arbitrarily large form may be designed without wasting too much screen real estate, by simply resizing the container to an appropriate size.
The "Align to Grid" option makes designing professional-looking user interfaces a lot less
frustrating. In fact, I would go as far as saying creating professional-looking user interfaces using Visual Basic's form designer is actually easy, fun and enjoyable. Even for left-brained programmers like me.
So, I have the following questions:
How do I make a form designer, in which the form being designed is inside a container? Is the form being designed an actual window contained inside another window? Or is it just a mockup "manually" painted by the form designer?
Do the Windows API and/or the MFC contain functions, classes, whatever that make it easy to create "selectable" items (surrounded by little white or blue boxes when they are selected, resizable when they are "grabbed" by one of these "edges")?
How do I implement the "Align to Grid" functionality?
Both the answers here are good, but left out what I consider to be the really interesting bits (including a couple that you didn't ask directly, but you might find of interest anyhow), so here's my 2c:
Drawing the controls
Ideally, you just go ahead and create a regular instance of the control. You want something that looks like a button? Create a real button. The tricky thing is stopping it from behaving like a button: you want clicks to activate it for moving, not actually 'click' it.
One way of dealing with this - assuming that the controls in question are 'HWND-based' (eg. the standard windows set of button, edit, static, listbox, treeview, etc.) - is to create the control, and then subclass it - ie. override the wndproc with SetWindowLongPtr(GWLP_WNDPROC, ...), so that the designer code can intercept mouse and keyboard input and use it to initiate a move, for example, instead of having the mouse input go through to the actual button code, which would instead interpret it as a 'click' event.
An alternative approach to subclassing is to place an invisible window above the button to capture the input. Same idea of intercepting input, just different implementation.
The above applies to both managed (VB.Net, C#) and unmanaged (C/C++) controls; they're both essentially stock windows HWNDs; the managed versions just have a managed wrapper code handing off to the underlying unmanaged control.
The old (pre-managed code) ActiveX controls, as used in pre-.Net VB, were a whole different ball game. There's a fairly complex relationship between an ActiveX container and the ActiveX controls within it, with many COM interfaces handling things like negotiation of properties, events, painting, and so on. (There's event a set of interfaces that allows an ActiveX control to receive input and draw itself without having its own HWND.) One benefit you get from this complexity, however, is that ActiveX controls have an explicit 'design mode'; so a control knows to respond appropriately in that case and can cooperate with the whole procedure.
The Form Itself...
So basically the controls are just regular controls. So you'd expect the form itself to be a regular form? - Almost. As far as I know, its just another HWND-based window, that's a child of the designer (so it gets clipped, and can be scrolled within it); but I think the designer is doing a bit of 'cheating' here, because usually Windows only draws frames like - with titlebar and min/max buttons that for actual top-level windows. I don't know offhand the exact technique that they're using here, but some options could include: painting it manually to mimic the Windows look; using the Windows "theme" APIs, which allow you to access the graphic elements used for the bits and pieces of titlebars and paint them wherever you want to; or, perhaps less likely, setting the window up as a "MDI Child window" - this is one exception case where windows will draw a frame around a nested window.
Draggable Handles
Simplest approach here is for the designer to create eight small square title-bar-less popup windows that sit above all the other elements - which initiate the appropriate resize code when they are clicked. As the user clicks from control to control, just move the drag handle windows to the currently active control. (Note that in all the above, Windows itself is figuring out who's been clicked, you never have to actually compare mouse coords against element rectangle coordinates and work it out yourself.)
Saving & Recreating
For plain windows system controls that are used by unmanaged C/C++, it's relatively easy: there's a well-known text-based file format - .rc - that describes the controls and locations. Have the designer spit out that (and likely a resource.h file also) and you're done: any C/C++ project can pick up those files and compile them in. Managed code (C#, VB.Net) has a somewhat more complex scheme, but it's still the same basic idea: write out a description in the style that the managed tools expect, and they'll happily compile it and use it.
(ActiveX controls are - you've guessed it - a whole 'nother story. There isn't a standard format that I'm aware of, so the form editor and runtime that consumes the data would be closely tied together - eg. the form editor from pre-.Net VB6 produces forms that only VB can use. - I think. It's been some time ago...)
As for recreating the form: if you have a .rc file, it gets compiled into a dialog resource, Windows has built in support to recreate those. Likewise, the managed code support libraries know how to recreate a form from its particular format. Both basically parse the description, and for each item, create elements of the appropriate classes, and set the appropriate style, text, and other properties as specified. It's not doing anything you can't do yourself, its just helper utility code.
Handling Focus
For a collection of HWNDs in any container, whether in 'test' mode or actually running in the real app, and regardless of whether you let Windows or Winforms handle the form creation or whether you created each HWNDs yourself, you can add tabbing support by calling IsDialogMessage in your message loop: see the MSDN page remarks section for details. (While WinForms could do this, I think it actually does its own focus handling, so that it can have tab order independent from visual stacking Z-Order.)
Other Things To Explore...
Make friends with the Spy++ app (part of the SDK, installs with Visual Studio). If you're going to do anything with HWNDs, managed or unmanaged, it's a real good idea to know how to use this tool: you can point it at any piece of UI on Windows, and see how it's constructed out of a tree of different types of HWNDs. Point it at the VB designer and see what's really happening for yourself. (Click the 'binoculars' icon on the toolbar, then drag the crosshairs the the window you're interested in.)
Also take a look at the resource files that the designer spits out. Everything that you can tweak or move or edit in the forms designer corresponds to some item somewhere in one of those resource files. Make a copy of them, tweak some settings, and then file-compare the two sets, and see what's changed. Try changing some things in the files by hand (I think they're nearly all text), reload, and see if the designer picked up your changes.
Other Things To Note...
Much of the above is specific to Windows - notably the fact that since we're using Window's own building blocks - HWNDs - we can get Windows itself to do some of the hard work for us: it gives us the facilities to reuse the controls themselves at design time so we don't have to draw mock-ups; to intercept input on other controls so we can make a click into a move or whatever other action we want, or figure out which control is clicked without having to do the location math ourselves. If this was a designer for some other UI framework - say Flash - which doesn't use HWNDs internally, it would likely instead use that framework's own internal facilities to do similar work.
Also, it's far easier if you limit the number of controls in the palette to a small finite set, at least at first. If you want to allow any control at all to be dragged in - eg. a 3rd party one, or one you've used in another project; you typically first need some way for that control to be 'registered' so that the designer knows that it's available in the first place. And you may also need some way to discover what icon it uses in the toolbar, what its name is, what properties it supports - and so on.
Have fun exploring!
You implement a form designer almost like a normal GUI. You have stuff you can drag (your widgets), you have stuff you can click (your buttons) and you have stuff you can select (your placed widgets) and that's really about it.
Q: Now, how do you display a window in a GUI?
A: You paint it, simple as that.
Q: And how do you keep stuff inside that window?
A: You check against the bounds of the "parent" object. You could almost say that a form designer is like a little game and you have a scene graph holding all your widgets, connected by parent-child-relations.
Q: Then, how do you select stuff in a GUI?
A: Check the current mouse position on-click against the bounds of all (near) widgets (a scene graph only helps here, like a quadtree).
Q: How do you align widgets on a grid?
A: For the grid alignment, let's have a simple example: Say your real resolution is 100px on the x-axis, but you want your grid to only have a resolution of 10px on x. Now say you move your widget by 28px in real resolution. To get the grid resolution, you simply divide by 10, get 2.8, round that, and finally move the widget 3 tiles on x. The rounding is the key here. only if the grid movement is >= ?.5, you snap to the next tile. Otherwise you simple stay at the old one.
Hope this can give you a general hint on how to start a form designer. Have fun. :)
(PS: Don't know about any specific WinAPI/MFC functions/class to help you along, sorry.)
Just to add a point or two to what #Xeo has already said:
First of all, no, you don't always draw all the content yourself. During normal design phase you're basically just drawing something that looks like the control, but (at least IIRC) it also lets you "run" a form in test mode (certainly the VC++ dialog designer does, and even though VB's was more primitive, I think it did have that particular capability as well). Test mode was when you can "run" a form before you've (necessarily) attached any code to it -- even though clicking a button (for example) doesn't do anything in the surrounding program, the control itself works as normal -- a button clicks normally, an edit control will let you edit, etc.
That is done by actually instantiating a control, telling it the correct position, size, and properties. ActiveX controls do quite a bit to support this, and the previous "Windows custom controls" did as well, though with considerably less sophistication. From the viewpoint of the control, it's working just about exactly like it normally would, receiving input, sending notification to its parent, etc. The only thing that's changed is that the parent most ignores most of the notifications it receives, but the control doesn't really know that.
There are two basic ways to do this. One is to create a collection of controls yourself, along with their positions, sizes, etc., and use CreateWindow (or CreateWindowEx, etc.) to create window of the correct class. While relatively easy to handle, this has the disadvantage that it leaves all the tab-handling to you.
The other possibility is to create a DLGTEMPLATE structure to hold data about the dialog box, and a some DLGITEMTEMPLATES for the individual controls, and finally use CreateDialogIndirect to create a dialog box with those specs, holding those controls. It's tedious, but it works, and when you're done it handles tabbing between controls automatically (and works the same as any other dialog, since it's the same Windows code creating it either way).
Second, since you've tagged this C++, you might want to take a look at some code on CodeProject that actually implements a dialog editor. Although it isn't quite as sophisticated as some of the commercial ones, this is a reasonably complete form/dialog editor, complete with most of what you've asked about.