
Originally Posted by
aamer4yu
Put a breakpoint and check where the call to messagebox is coming from...
Hi,
Tried debugging and found that function validateInput is getting called twice from qobject.cpp and hence MessageBox is appearing twice.
From thorough debugging it is found that in qobject.cpp statement @ line # 4 & line# 8 are returning two different Memory address hence two different Connection.
I am not sure what this Connections objects and why it has two different objects. 
Also, one observation is as follow:
- Application is having small login window asking User-name and password. Here also few validations are performed and QMessageBox is used to give appropriate error message,but here Message window is not appearing twice.
Here is a piece of code from validateInput function.
Function: validateInput.
QString expenseHead
= ui
->expenseHead
->text
();
int expenseCategory = ui->expenseClassCombo->currentIndex();
int expenseSubCategory = ui->expenseSubClassCombo->currentIndex();
QString amountSpent
= ui
->expenseAmount
->text
();
QString expenseDate
= ui
->expenseDate
->text
();
QString expenseRemarks
= ui
->remarks
->toPlainText
();
// QMessageBox::information(0,"Info",expenseHead + "|" + QString::number(expenseCategory) + "|"
// + QString::number(expenseSubCategory));
if(expenseHead.isEmpty()){
QMessageBox::critical(0,
QObject::tr("Validation Error"),
"Expense Head is required. It can't be left blank.");
//ui->expenseHead->setFocus();
return false;
}
if(expenseCategory == 0){
QMessageBox::critical(0,
QObject::tr("Validation Error"),
"Expense Category must be selected.");
ui->expenseClassCombo->setFocus();
return false;
}
if(expenseSubCategory == 0){
QMessageBox::critical(0,
QObject::tr("Validation Error"),
"Expense SubCategory must be selected.");
ui->expenseSubClassCombo->setFocus();
return false;
}
if(amountSpent.isEmpty()){
QMessageBox::critical(0,
QObject::tr("Validation Error"),
"Amount Spent is required. It can't be left blank.");
ui->expenseAmount->setFocus();
return false;
}
if(amountSpent.toDouble() == 0.00){
ui->expenseAmount->setFocus();
return false;
}
return true;
QString expenseHead = ui->expenseHead->text();
int expenseCategory = ui->expenseClassCombo->currentIndex();
int expenseSubCategory = ui->expenseSubClassCombo->currentIndex();
QString amountSpent = ui->expenseAmount->text();
QString expenseDate = ui->expenseDate->text();
QString expenseRemarks = ui->remarks->toPlainText();
// QMessageBox::information(0,"Info",expenseHead + "|" + QString::number(expenseCategory) + "|"
// + QString::number(expenseSubCategory));
if(expenseHead.isEmpty()){
QMessageBox::critical(0,QObject::tr("Validation Error"),"Expense Head is required. It can't be left blank.");
//ui->expenseHead->setFocus();
return false;
}
if(expenseCategory == 0){
QMessageBox::critical(0,QObject::tr("Validation Error"),"Expense Category must be selected.");
ui->expenseClassCombo->setFocus();
return false;
}
if(expenseSubCategory == 0){
QMessageBox::critical(0,QObject::tr("Validation Error"),"Expense SubCategory must be selected.");
ui->expenseSubClassCombo->setFocus();
return false;
}
if(amountSpent.isEmpty()){
QMessageBox::critical(0,QObject::tr("Validation Error"),"Amount Spent is required. It can't be left blank.");
ui->expenseAmount->setFocus();
return false;
}
if(amountSpent.toDouble() == 0.00){
QMessageBox::critical(0,QObject::tr("Wrong Input"),"Amount must be greater than zero.");
ui->expenseAmount->setFocus();
return false;
}
return true;
To copy to clipboard, switch view to plain text mode
File : qobject.cpp
...
do {
QObjectPrivate::Connection *c = connectionLists->at(signal_index).first;
if (!c) continue;
// We need to check against last here to ensure that signals added
// during the signal emission are not emitted in this emission.
QObjectPrivate::Connection *last = connectionLists->at(signal_index).last;
do {
if (!c->receiver)
continue;
QObject * const receiver
= c
->receiver;
// determine if this connection should be sent immediately or
// put into the event queue
if ((c->connectionType == Qt::AutoConnection
&& (currentThreadData != sender->d_func()->threadData
|| receiver->d_func()->threadData != sender->d_func()->threadData))
|| (c->connectionType == Qt::QueuedConnection)) {
queued_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
continue;
} else if (c->connectionType == Qt::BlockingQueuedConnection) {
blocking_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
continue;
}
const int method = c->method;
QObjectPrivate::Sender currentSender;
currentSender.sender = sender;
currentSender.signal = signal_absolute_index;
currentSender.ref = 1;
QObjectPrivate::Sender *previousSender = 0;
if (currentThreadData == receiver->d_func()->threadData)
previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender);
locker.unlock();
if (qt_signal_spy_callback_set.slot_begin_callback != 0) {
qt_signal_spy_callback_set.slot_begin_callback(receiver,
method,
argv ? argv : empty_argv);
}
#if defined(QT_NO_EXCEPTIONS)
metacall
(receiver,
QMetaObject::InvokeMetaMethod, method, argv ? argv
: empty_argv
);
#else
QT_TRY {
metacall
(receiver,
QMetaObject::InvokeMetaMethod, method, argv ? argv
: empty_argv
);
} QT_CATCH(...) {
locker.relock();
QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender);
--connectionLists->inUse;
Q_ASSERT(connectionLists->inUse >= 0);
if (connectionLists->orphaned && !connectionLists->inUse)
delete connectionLists;
QT_RETHROW;
}
#endif
if (qt_signal_spy_callback_set.slot_end_callback != 0)
qt_signal_spy_callback_set.slot_end_callback(receiver, method);
locker.relock();
QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender);
if (connectionLists->orphaned)
break;
} while (c != last && (c = c->nextConnectionList) != 0);
if (connectionLists->orphaned)
break;
} while (signal_index >= 0 && (signal_index = -1)); //start over for -1 (all signal)
...
...
do {
QObjectPrivate::Connection *c = connectionLists->at(signal_index).first;
if (!c) continue;
// We need to check against last here to ensure that signals added
// during the signal emission are not emitted in this emission.
QObjectPrivate::Connection *last = connectionLists->at(signal_index).last;
do {
if (!c->receiver)
continue;
QObject * const receiver = c->receiver;
// determine if this connection should be sent immediately or
// put into the event queue
if ((c->connectionType == Qt::AutoConnection
&& (currentThreadData != sender->d_func()->threadData
|| receiver->d_func()->threadData != sender->d_func()->threadData))
|| (c->connectionType == Qt::QueuedConnection)) {
queued_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
continue;
} else if (c->connectionType == Qt::BlockingQueuedConnection) {
blocking_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
continue;
}
const int method = c->method;
QObjectPrivate::Sender currentSender;
currentSender.sender = sender;
currentSender.signal = signal_absolute_index;
currentSender.ref = 1;
QObjectPrivate::Sender *previousSender = 0;
if (currentThreadData == receiver->d_func()->threadData)
previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender);
locker.unlock();
if (qt_signal_spy_callback_set.slot_begin_callback != 0) {
qt_signal_spy_callback_set.slot_begin_callback(receiver,
method,
argv ? argv : empty_argv);
}
#if defined(QT_NO_EXCEPTIONS)
metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
#else
QT_TRY {
metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
} QT_CATCH(...) {
locker.relock();
QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender);
--connectionLists->inUse;
Q_ASSERT(connectionLists->inUse >= 0);
if (connectionLists->orphaned && !connectionLists->inUse)
delete connectionLists;
QT_RETHROW;
}
#endif
if (qt_signal_spy_callback_set.slot_end_callback != 0)
qt_signal_spy_callback_set.slot_end_callback(receiver, method);
locker.relock();
QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender);
if (connectionLists->orphaned)
break;
} while (c != last && (c = c->nextConnectionList) != 0);
if (connectionLists->orphaned)
break;
} while (signal_index >= 0 && (signal_index = -1)); //start over for -1 (all signal)
...
To copy to clipboard, switch view to plain text mode
Bookmarks