QProgressDialog: don't crash when setting the same {bar,button,label} again
The associated test has unearthed that setBar() fails to make the new bar a child of the progress dialog. This will be fixed in a separate commit. Task-number: QTBUG-40502 Change-Id: I2d09ebb07ae6395449a4efe38a638df831eebdd7 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
parent
41dae1e33a
commit
e2331c6f76
@ -354,6 +354,11 @@ QProgressDialog::~QProgressDialog()
|
|||||||
void QProgressDialog::setLabel(QLabel *label)
|
void QProgressDialog::setLabel(QLabel *label)
|
||||||
{
|
{
|
||||||
Q_D(QProgressDialog);
|
Q_D(QProgressDialog);
|
||||||
|
if (label == d->label) {
|
||||||
|
if (label)
|
||||||
|
qWarning("QProgressDialog::setLabel: Attempt to set the same label again");
|
||||||
|
return;
|
||||||
|
}
|
||||||
delete d->label;
|
delete d->label;
|
||||||
d->label = label;
|
d->label = label;
|
||||||
if (label) {
|
if (label) {
|
||||||
@ -411,6 +416,11 @@ void QProgressDialog::setLabelText(const QString &text)
|
|||||||
void QProgressDialog::setCancelButton(QPushButton *cancelButton)
|
void QProgressDialog::setCancelButton(QPushButton *cancelButton)
|
||||||
{
|
{
|
||||||
Q_D(QProgressDialog);
|
Q_D(QProgressDialog);
|
||||||
|
if (d->cancel == cancelButton) {
|
||||||
|
if (cancelButton)
|
||||||
|
qWarning("QProgressDialog::setCancelButton: Attempt to set the same button again");
|
||||||
|
return;
|
||||||
|
}
|
||||||
delete d->cancel;
|
delete d->cancel;
|
||||||
d->cancel = cancelButton;
|
d->cancel = cancelButton;
|
||||||
if (cancelButton) {
|
if (cancelButton) {
|
||||||
@ -483,6 +493,10 @@ void QProgressDialog::setBar(QProgressBar *bar)
|
|||||||
qWarning("QProgressDialog::setBar: Cannot set a new progress bar "
|
qWarning("QProgressDialog::setBar: Cannot set a new progress bar "
|
||||||
"while the old one is active");
|
"while the old one is active");
|
||||||
#endif
|
#endif
|
||||||
|
if (bar == d->bar) {
|
||||||
|
qWarning("QProgressDialog::setBar: Attempt to set the same progress bar again");
|
||||||
|
return;
|
||||||
|
}
|
||||||
delete d->bar;
|
delete d->bar;
|
||||||
d->bar = bar;
|
d->bar = bar;
|
||||||
int w = qMax(isVisible() ? width() : 0, sizeHint().width());
|
int w = qMax(isVisible() ? width() : 0, sizeHint().width());
|
||||||
|
@ -44,8 +44,11 @@
|
|||||||
|
|
||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
#include <qprogressbar.h>
|
||||||
#include <qprogressdialog.h>
|
#include <qprogressdialog.h>
|
||||||
|
#include <qpushbutton.h>
|
||||||
#include <qlabel.h>
|
#include <qlabel.h>
|
||||||
|
#include <qpointer.h>
|
||||||
#include <qthread.h>
|
#include <qthread.h>
|
||||||
|
|
||||||
class tst_QProgressDialog : public QObject
|
class tst_QProgressDialog : public QObject
|
||||||
@ -59,6 +62,7 @@ private Q_SLOTS:
|
|||||||
void getSetCheck();
|
void getSetCheck();
|
||||||
void task198202();
|
void task198202();
|
||||||
void QTBUG_31046();
|
void QTBUG_31046();
|
||||||
|
void settingCustomWidgets();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_QProgressDialog::cleanup()
|
void tst_QProgressDialog::cleanup()
|
||||||
@ -184,5 +188,51 @@ void tst_QProgressDialog::QTBUG_31046()
|
|||||||
QCOMPARE(50, dlg.value());
|
QCOMPARE(50, dlg.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QProgressDialog::settingCustomWidgets()
|
||||||
|
{
|
||||||
|
QPointer<QLabel> l = new QLabel;
|
||||||
|
QPointer<QPushButton> btn = new QPushButton;
|
||||||
|
QPointer<QProgressBar> bar = new QProgressBar;
|
||||||
|
QVERIFY(!l->parent());
|
||||||
|
QVERIFY(!btn->parent());
|
||||||
|
QVERIFY(!bar->parent());
|
||||||
|
|
||||||
|
{
|
||||||
|
QProgressDialog dlg;
|
||||||
|
|
||||||
|
QVERIFY(!dlg.isAncestorOf(l));
|
||||||
|
dlg.setLabel(l);
|
||||||
|
QVERIFY(dlg.isAncestorOf(l));
|
||||||
|
QTest::ignoreMessage(QtWarningMsg, "QProgressDialog::setLabel: Attempt to set the same label again");
|
||||||
|
dlg.setLabel(l); // setting the same widget again should not crash
|
||||||
|
QVERIFY(l); // and not delete the (old == new) widget
|
||||||
|
|
||||||
|
QVERIFY(!dlg.isAncestorOf(btn));
|
||||||
|
dlg.setCancelButton(btn);
|
||||||
|
QVERIFY(dlg.isAncestorOf(btn));
|
||||||
|
QTest::ignoreMessage(QtWarningMsg, "QProgressDialog::setCancelButton: Attempt to set the same button again");
|
||||||
|
dlg.setCancelButton(btn); // setting the same widget again should not crash
|
||||||
|
QVERIFY(btn); // and not delete the (old == new) widget
|
||||||
|
|
||||||
|
QVERIFY(!dlg.isAncestorOf(bar));
|
||||||
|
dlg.setBar(bar);
|
||||||
|
QEXPECT_FAIL("", "QProgressBar doesn't adopt custom progress bar as children", Continue);
|
||||||
|
QVERIFY(dlg.isAncestorOf(bar));
|
||||||
|
QTest::ignoreMessage(QtWarningMsg, "QProgressDialog::setBar: Attempt to set the same progress bar again");
|
||||||
|
dlg.setBar(bar); // setting the same widget again should not crash
|
||||||
|
QVERIFY(bar); // and not delete the (old == new) widget
|
||||||
|
}
|
||||||
|
|
||||||
|
QVERIFY(!l);
|
||||||
|
QVERIFY(!btn);
|
||||||
|
#if 0
|
||||||
|
QEXPECT_FAIL("", "QProgressBar doesn't clean up custom progress bars", Continue);
|
||||||
|
QVERIFY(!bar);
|
||||||
|
#else
|
||||||
|
// make cleanup() pass
|
||||||
|
delete bar;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QProgressDialog)
|
QTEST_MAIN(tst_QProgressDialog)
|
||||||
#include "tst_qprogressdialog.moc"
|
#include "tst_qprogressdialog.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user