Call a function at a dialog execution
-
Hello everybody,
I'm writing an application in which I need to open a dialog and execute automatically (without clicking on a push button for example) some animation function.
For opening the dialog, the main windows has a push button that is connected to a slot, which contains
@
//Open the dialog
dialog dlg=new Dlg ;
dlg.exec();
//Get data from the dialog after it is closed
...@My dialog class is something like the following, where functionToBeCalled() is the function to be called:
@class Dlg : public QDialog
{
/* ...other attributes and methods here... */public:
void functionToBeCalled();
}@Could anybody tell me how to do that please?
Thank you in advance for your help.
-
As you are already subclassing QDialog you could probably overwrite the exec() function to call the functionToBeCalled();
A (untested) solution could be:
@
int Dlg::exec()
{
functionToBeCalled();
return QDialog::exec();
}
@Another approach is to overwrite exec() to emit a signal that is connected to functionToBeCalled(). That would require functionToBeCalled to be defined as slot - or to use another slot to call the function...
-
Hi Daniel,
Thank you for your reply.
I have tested your 'untested' :D solution. Unfortunately, it is not what I need. Remember that my functionToBeCalled() is a function that does some animation (inside a QGraphicsView), so if we call this function before the exec() function, the user will not see the animation.
I have got an idea but could not make it work. In the following code, I re-implement completely the exec() function, by just copying the source code of QDialog::exec() and adding functionToBeCalled() after show():
@int Dlg::exec()
{
Q_D(QDialog);if (d->eventLoop) { qWarning("QDialog::exec: Recursive call detected"); return -1; } bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose, false); d->resetModalitySetByOpen(); bool wasShowModal = testAttribute(Qt::WA_ShowModal); setAttribute(Qt::WA_ShowModal, true); setResult(0);
//On Windows Mobile we create an empty menu to hide the current menu
#ifdef Q_WS_WINCE_WM
#ifndef QT_NO_MENUBAR
QMenuBar *menuBar = 0;
if (!findChild<QMenuBar *>())
menuBar = new QMenuBar(this);
if (qt_wince_is_smartphone()) {
QAction *doneAction = new QAction(tr("Done"), this);
menuBar->setDefaultAction(doneAction);
connect(doneAction, SIGNAL(triggered()), this, SLOT(_q_doneAction()));
}
#endif //QT_NO_MENUBAR
#endif //Q_WS_WINCE_WMbool showSystemDialogFullScreen = false;
#ifdef Q_OS_SYMBIAN
if (qobject_cast<QFileDialog *>(this) || qobject_cast<QFontDialog *>(this) ||
qobject_cast<QWizard *>(this)) {
showSystemDialogFullScreen = true;
}
#endif // Q_OS_SYMBIANif (showSystemDialogFullScreen) { setWindowFlags(windowFlags() | Qt::WindowSoftkeysVisibleHint); setWindowState(Qt::WindowFullScreen); } show();
/****** MY ANIMATION HERE *******/
functionToBeCalled();#ifdef Q_WS_MAC
d->mac_nativeDialogModalHelp();
#endifQEventLoop eventLoop; d->eventLoop = &eventLoop; QPointer<QDialog> guard = this; (void) eventLoop.exec(QEventLoop::DialogExec); if (guard.isNull()) return QDialog::Rejected; d->eventLoop = 0; setAttribute(Qt::WA_ShowModal, wasShowModal); int res = result(); if (deleteOnClose) delete this;
#ifdef Q_WS_WINCE_WM
#ifndef QT_NO_MENUBAR
else if (menuBar)
delete menuBar;
#endif //QT_NO_MENUBAR
#endif //Q_WS_WINCE_WM
return res;
}@The first error I got is 'QDialog::d_func' : cannot access private member declared in class 'QDialog'.
Hope somebody can help.
Have a nice day !