Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Call a function at a dialog execution
Forum Updated to NodeBB v4.3 + New Features

Call a function at a dialog execution

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 5.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    Nesbit
    wrote on last edited by
    #1

    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.

    1 Reply Last reply
    0
    • L Offline
      L Offline
      lycis
      wrote on last edited by
      #2

      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...

      1 Reply Last reply
      0
      • N Offline
        N Offline
        Nesbit
        wrote on last edited by
        #3

        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_WM

        bool showSystemDialogFullScreen = false;
        

        #ifdef Q_OS_SYMBIAN
        if (qobject_cast<QFileDialog *>(this) || qobject_cast<QFontDialog *>(this) ||
        qobject_cast<QWizard *>(this)) {
        showSystemDialogFullScreen = true;
        }
        #endif // Q_OS_SYMBIAN

        if (showSystemDialogFullScreen) {
            setWindowFlags(windowFlags() | Qt::WindowSoftkeysVisibleHint);
            setWindowState(Qt::WindowFullScreen);
        }
        show();
        

        /****** MY ANIMATION HERE *******/
        functionToBeCalled();

        #ifdef Q_WS_MAC
        d->mac_nativeDialogModalHelp();
        #endif

        QEventLoop eventLoop;
        d->eventLoop = &eventLoop;
        QPointer<QDialog> guard = this;
        (void) eventLoop.exec&#40;QEventLoop::DialogExec&#41;;
        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 !

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved