Fullscreen for QDialog from within MainWindow only

2020-06-29 23:33发布

(Testing with C++ on Qt 4.8 and Ubuntu 12.10 unity)

I've got a main window which displays a QDialog. When I put the Dialog window full-screen it does not seem to always work even though it seems to be a proper window. Meaning, the window can appear full-screen, though only sometimes.

Anyone got an idea? I know Qt states it might not work for all X environments, but it can't be that bad, can it?

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QDialog* d = new QDialog();
    d->setModal(false);
    d->show();       
    qDebug() << d->isWindow();

    // works most of the times, though not always:
    // d->showFullScreen();

    // sometimes works, sometimes it doesn't:
    QTimer::singleShot(2000, d, SLOT(showFullScreen()));
}

2条回答
聊天终结者
2楼-- · 2020-06-29 23:50

DomTomCat here at stackoverflow showed a way to detect Ubuntu and the QDialog problem is related to a bug in Metacity (Ubuntu's default window manager).

Metacity doesn't manage the same way dialogs and main windows and it has to be tricked making it think that a QDialog is a normal window. In order to do so using QDialog class it's window flags have to be changed.

Instead of doing all the steps DomTomCat says, you can detect the session and then just

//example inside the QDialog
this->setWindowFlags(Qt::Window);
this->showFullScreen();

The bug was reported (and ignored) before but as far as I know this is the first simple workaround.

https://bugreports.qt.io/browse/QTBUG-16034

https://git.gnome.org/browse/metacity/tree/src/core/window.c#n6326

Ubuntu can also use compiz. This can be seen at:

grep DefaultProvider-windowmanager /usr/share/gnome-session/sessions/*

Best regards,

Iker De Echaniz.

查看更多
姐就是有狂的资本
3楼-- · 2020-06-29 23:54

I came to a method, which works. I don't know why it works compared to just calling showFullScreen(). I guess this is not the perfect and clean solution. This can surely be adapted to other environmental variables and X sessions.

    QDialog* d = new QDialog();
    d->setModal(false);
    d->show();     

    const QString session = QString(getenv("DESKTOP_SESSION")).toLower();
    QByteArray geometry;
    if (session == "ubuntu") {
        geometry = _d->saveGeometry();
        d->setFixedSize(qApp->desktop()->size());
        d->setWindowFlags(Qt::FramelessWindowHint);
        d->setWindowState( d->windowState() | Qt::WindowFullScreen);
        d->show();
        d->activateWindow();
    } else {
        d->showFullScreen();
    }

For restoring from the fullscreen state, this has worked

    if (session == "ubuntu") {
        d->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
        d->setMinimumSize(0,0);
        d->restoreGeometry(geometry);
        d->setWindowFlags(Qt::Dialog);
        d->show();
        d->activateWindow();
    } else {
        d->showNormal();
    }
查看更多
登录 后发表回答