I am seeing confusing QEvent::WindowActivate events associated with floating 
windows on Macintosh. I wonder if someone can give me an explanation. Please 
excuse the length...

The code here is a vastly simplified version of actual application code.

I use code like this to make three floating windows. Note that each code block 
makes a floating window, shows it and activates it. There is also code to name 
everything so you can tell what you're seeing, and qDebug() statements so that 
I can tell the order of what's happening. (hope it comes through readable):
 void MainWindow::onGoButton()
{
        Qt::WindowFlags qtflags = Qt::Tool | Qt::WindowStaysOnTopHint;
        qtflags = qtflags | Qt::CustomizeWindowHint | Qt::WindowTitleHint | 
Qt::CustomizeWindowHint | Qt::WindowTitleHint |
                          Qt::WindowMinimizeButtonHint | 
Qt::WindowMaximizeButtonHint;

        qDebug() << "About to create Window A";
        QWidget * wa = new QWidget(0, qtflags);
        wa->setObjectName("Window A");
        wa->setWindowTitle("Window A");
        qDebug() << "About to show Window A";
        wa->show();
        qDebug() << "About to activate Window A";
        QApplication::setActiveWindow(wa);

        qDebug() << "About to create Window B";
        QWidget * wb = new QWidget(0, qtflags);
        wb->setObjectName("Window B");
        wb->setWindowTitle("Window B");
        qDebug() << "About to show Window B";
        wb->show();
        qDebug() << "About to activate Window B";
        QApplication::setActiveWindow(wb);

        qDebug() << "About to create Window C";
        QWidget * wc = new QWidget(0, qtflags);
        wc->setObjectName("Window C");
        wc->setWindowTitle("Window C");
        qDebug() << "About to show Window C";
        wc->show();
        qDebug() << "About to activate Window C";
        QApplication::setActiveWindow(wc);
}

I also use QApplication::notify() to monitor QEvent::WindowActivate:

 bool myApp::notify(QObject *object, QEvent *event)
{
        if (event->type() == QEvent::WindowActivate)
        {
                qDebug() << "Window activate:" << object->objectName() << "and 
the active window is" << QApplication::activeWindow()->objectName();
        }
        return QApplication::notify(object, event);
}

On Macintosh using Qt 5.4 RC (which means Cocoa) on OS X 10.9.5 I get this 
output:

About to create Window A
About to show Window A
About to activate Window A
Window activate: "Window A" and the active window is "Window A"
About to create Window B
About to show Window B
About to activate Window B
Window activate: "Window B" and the active window is "Window B"
Window activate: "Window A" and the active window is "Window B"
About to create Window C
About to show Window C
About to activate Window C
Window activate: "Window B" and the active window is "Window C"
Window activate: "Window A" and the active window is "Window C"
Window activate: "Window C" and the active window is "Window C"

Note that the target for the event isn't always the same as what Qt thinks is 
the active window.
On Windows I get more reasonable output:

About to create Window A
About to show Window A
About to activate Window A
Window activate: "Window A" and the active window is "Window A"
About to create Window B
About to show Window B
About to activate Window B
Window activate: "Window B" and the active window is "Window B"
About to create Window C
About to show Window C
About to activate Window C
Window activate: "Window C" and the active window is "Window C"

Am I just seeing Cocoa weirdness? It looks like some of the time Qt is lying to 
me about the activating window. But if it's a Qt bug, then it's been there a 
long time- I also see it when building with Qt 4.8.6.

Thanks for any insight that can be offered!

-John Weeks

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to