Customize the buttons in a QWIzard? - c++

QWizard have some options related to the buttons as follows:
NoDefaultButton
NoBackButtonOnStartPage
NoBackButtonOnLastPage
DisabledBackButtonOnLastPage
HaveNextButtonOnLastPage
HaveFinishButtonOnEarlyPages
NoCancelButton
CancelButtonOnLeft
HaveHelpButton
HelpButtonOnRight
Now these options are not enough to me, is there any way to do the customization??
For example, after setting a QWizardPage as a final page, the "next" button is still there since the page originally have next page.
What I want is to change "next" to "finish" instead of one more "finish" button.
Another example is that at the first page, I want the "back" button shows up but is disabled.
How can I control these buttons in a more flexible way?
I want make some buttons disappear and some be disabled.

If you call the follwing function:
QAbstractButton * QWizard::button ( WizardButton which ) const
with following argument:
QWizard::NextButton
then you should get a pointer to the "Next" button.
The only thing left to do is to call setVisible(bool) function of the button when you are one the last but one (pre-last) page?
I have never done this, just tried to help you.

Related

is there a way to minimize/hide and show the QListWidget in my UI

This is my UI, on the right side I have a QListWidget with 3 items, when I click these items, the corresponding entries on the left side of the UI must be populated , anyways The QListwidget on the right side, i do not want it to be always visible, i want the QListwidget to be minimized usually and show up once the "show options>>" button is clicked, and when i click it again, it should be minimized again,
is there any way to accomplish this using QT Designer or code, what widgets or tools i need to use to get this ?
you can set the visibility to false, this will hide the listView
ui->myList.setVisible(false);
maybe define 1 slot taking a bool var to set the visibility to true or false.
then code the slot of the click of the button so that is calls the slot that hide/show the list!
Connect a slot to QPushButton::clicked() "Show Options >>" button and use setVisible(true) on your listwidget.
Connect a slot to QListWidget::itemClicked(QListWidgetItem *item). This is your place where you can handle which item the user clicked and populate the data. And then, use again setVisible(false) function to hide the list.
If you wish to set width of the form, depending of the list appearance, use setFixedWidth() of your form to extend it or shrink it. Use width() function of your list, get its width and to add it or subtract it from the form's width()

MFC DDX_Radio causes debug assertion failure when DoDataExchange is called (dlgdata.cpp Line 286)

I have a dialog with radio button with groups of 4 buttons.
DDX_Radio(pDX, D_RADIO_GROUPLEAD, intToStore) in DoDataExchange is there for saving and loading.
It works perfectly fine.
Selection changed, DoDataExchange called, stores and loads data no problem.
Problem occurs when I hide one of the radio button (hide it via ShowWindow(SW_HIDE). Let's just call it 3rd button for reference. And previously, the selection was this 3rd button.
I have logic that will automatically select the default one (one with Group flagged as true in the editor). I call the button's SetCheck(1).
Visually everything seems to be working.
However, when I click on 2nd button, then try to call DoDataExchange (hence DDX_Radio), it will causes debug assertion failure. (dlgdata.cpp Line 286)
AND
the data is not properly populated back in intToStore.
Why could this be and how can I avoid this issue?
Thank you.
The problem is, that the auto radio button stuff in Windows skips buttons that are disabled. In detail. You click on button 2 while button 3 is selected and disabled. Button 2 gets selected but button 3 is not unchecked.
The next problem occurs when DoDataExchange runs. It doesn't check if a button is enabled or disabled. DDX_Radio just loops over all radio buttons, and it find 2 buttons in the group are enabled. This causes the ASSERT. DDX_Radio don't care if a button is enabled or disabled.
My advice: Use a custom OnClick handle by yourself, and disable all other buttons manually.

how to add desired propertypages to propertysheet when next button is clicked

I Want to add propertypages to my propertysheet .I will let you know my intention i.e,Initially I created a propertysheet and added 4 propertypages . Now in wizard mode as we have Next,Back,Cancel which are used for switching between pages. I want to add different pages when I click on Next button.Moreover I had first propertypage which consists of three buttons where if click first button I must add a page and again if go for second page I must be able to add a page which is different from the previous one.Similarly,when I click on the third button I must add one more different page.I will show the sequence of pages,
FirstPage:
Button1:
Button2:
Button3:
Back Next Cancel
if "Button1" is clicked then Next will be enabled and then click Next then Page2 should be added and again rollback and click button2.
if "Button2" is clicked then Next will be enabled and then click Next then Page3 should be added and again rollback and click button3.
if "Button3" is clicked then Next will be enabled and then click Next then Page4 should be added.
I tried handling it in "virtual LRESULT OnWizardNext()" method ,which returns CPropertyPage::OnWizardNext(). But it is not working fine ,can anyone please let me know where to handle the event such that i must be able to add differnt pages when go for the three different buttons.
At any time you can call RemovePage in OnWizardNext and you can call AddPage in on Wizard next.
But you should never remove the page that is currently active (causing the OnWizadNext call).
This code will remove all pages following the current one and you are free to add others. returning 0 lets the wizard to continue to the next page:
// Delete all following pages
CMySheet *pSheet = static_cast<CMySheet*>(GetParent());
while (pSheet->GetActiveIndex()<pSheet->GetPageCount()-1)
pSheet->RemovePage(pSheet->GetPageCount()-1);
if (case1)
pSheet->AddPagesForCase1();
else if (case2)
pSheet->AddPagesForCase2();
...
// Do the default and advance to the next page
return 0;

"Sticky" MFC popup menu

I currently have some toolbar buttons with a small arrow on the side (TBSTYLE_EX_DRAWDDARROWS) that, when clicked, result in a popup context menu being displayed under the button. This is done by constructing a custom popup menu and calling TrackPopupMenu.
The client now wants to be able to select multiple options from the menu before it closes, so that multiple options can be be modified without the need to re-open the menu and wait for an intermediate redraw between each change.
For example:
User clicks dropdown button
Dropdown menu appears (modal, waits indefinitely for user action)
User clicks some item (e.g., toggle a checkmark)
Timer (e.g., 500ms) starts
If timer expires, the menu is closed and all selected actions are executed.
User clicks another item before the timer expires, go back to 4.
The best I can come up with is to redisplay the menu by calling TrackPopupMenu multiple times. This makes the menu "flicker" when you select an item, and will probably require me to start a thread in order to do the timeouts, which I would rather avoid.
Rather than a menu, put up a dialog box with the options on it. A dialog can easily do all that is required.
A menu that doesn't close when you click it will just seem wrong. A dialog that closes by itself will seem wrong too, but it's probably the least of two evils.
Edit: If there's anything I've learned with Microsoft, it's don't try to fight the default behavior. You're asking for trouble if you do.
If you're building your menu dynamically I can see how automatic sizing can be handy, but it's not hard to do in a dialog either - make the dialog really big and before it becomes visible, enumerate the children and take a union of all their rectangles, then resize to that. Checking the boundaries to make sure they're on-screen is just a few if statements with OffsetRect. Checkboxes are trivial; icons less so, but still not bad.
One additional enhancement that would be easy to add is to dismiss the dialog immediately on a double-click.
Following #Mark Ransom's answer, you should put up a dialog box. But you can make the dialog modeless and make it close itself when you click outside of it (i.e., the dialog loses focus). That way it could behave more like a menu.
Notice that normal menus never go away by themselves, you always have to click somewhere outside the menu (or one of its options) to make it disappear.

C++ Builder runtime error - cannot focus a disabled or invisible window

On main form I have TPageControl and on all of it's tabs I have corresponding Save buttons which are activated on Alt+S combination.
Of course, depending on which tab is opened at the moment, the handler for corresponding Save button should be called; but I get "cannot focus a disabled or invisible window" runtime error if I try to save with Alt+S.
And I've noticed that, the handler of a Save button from the tab which was active before the current tab, is called, but don't know why.
I tried putting Save buttons in panels (it worked fine for some similar problems), but still the same thing happens.
Cheers.
You could do it all with one button. In the OnClick handler, check which page is the current one, and call the saving function for that page.