[SOLVED] QMessageBox Buttons
-
Hi
I have a QDialog and when pressed close, i want to open a QMessageBox and ask whether or not to save.
Normally one would use
QMessageBox::StandardButton reply; reply = QMessageBox::question(this , "Closing" , "Do you want to save?" , QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
But i want some more features. First is to be able to change buttons' texts. Secondly i want to make Yes button unclickable, if some condition is not met.
So i figured out i need to manually do it
QMessageBox messageBox; messageBox.setWindowTitle("Do you want to save?"); messageBox.addButton(BUTTON_YES, QMessageBox::YesRole); messageBox.addButton(BUTTON_NO, QMessageBox::NoRole); messageBox.addButton(BUTTON_CANCEL, QMessageBox::RejectRole); messageBox.setEscapeButton(QMessageBox::Cancel); messageBox.setDefaultButton(QMessageBox::Yes); QList<QAbstractButton*> messageBoxButtons = messageBox.buttons(); // How do i get buttons properly? connect(messageBoxButtons.at(0), SIGNAL(clicked(bool)) , this, SLOT(messageBoxYesClicked(bool))); connect(messageBoxButtons.at(1), SIGNAL(clicked(bool)) , this, SLOT(messageBoxNoClicked(bool))); connect(messageBoxButtons.at(2), SIGNAL(clicked(bool)) , this, SLOT(messageBoxCancelClicked(bool))); if(canSaveContent() == false) // Set YesRole button to disabled messageBox.exec(); if(m_reply == QMessageBox::Yes) // Do something else if(m_reply == QMessageBox::No) // Do something else // Do something
These functions merely sets m_reply with proper values.
void DialogEntryNote::messageBoxYesClicked(bool checked) { Q_UNUSED(checked) m_reply = QMessageBox::Yes; }
How do i get buttons properly? I want to connect the button' clicked() signal with function slots i prepared.
I think my current method is lame. I want to do it the right way. What sort of methods should i follow?
Thank you in advance for any advice.
-
@mcosta exec() returns int. Can you eleborate a little bit more please?
Also doc says
When using QMessageBox with custom buttons, this function returns an opaque value; use clickedButton() to determine which button was clicked.
Does button roles acts the same as standard buttons?
I can check the text on the clicked button for that purpose maybe.
-
@mcosta msgBox.standardButton(msgBox.clickedButton()) always returns QMessageBox::NoButton.
Returns the standard button enum value corresponding to the given button, or NoButton if the given button isn't a standard button.
I assume thats because messageBox.addButton(BUTTON_YES, QMessageBox::YesRole); does not create a standard button. I searched for a method to get clicked buttons given role. But no help :(
I tried using button text, which solved my problems but that just feels lame :(
-
Hi,
Then why not just:
if (BUTTON_YES == messageBox.clickedButton()) { // do stuff }
?
-
Sorry, I thought that BUTTON_YES was a pointer to a QAbstractButton instance.
What I was referring to is described in the documentation of clickedButton