Полноэкранный режим для QDialog из MainWindow только иногда работает

(Тестирование с C++ на Qt 4.8 и Ubuntu 12.10 unity)

У меня есть главное окно, которое отображает QDialog. Когда я открываю диалоговое окно в полноэкранном режиме, оно, кажется, не всегда работает, даже если оно кажется правильным. То есть окно может появиться в полноэкранном режиме, но только иногда.

У кого-нибудь есть идея? Я знаю, что Qt утверждает, что это может не работать для всех сред X, но это не так уж плохо, не так ли?

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 ответа

Решение

DomTomCat здесь, в stackru, показал способ обнаружения Ubuntu, и проблема QDialog связана с ошибкой в ​​Metacity (оконный менеджер по умолчанию в Ubuntu).

Metacity не управляет диалоговыми окнами и главными окнами одинаково, и его приходится обманывать, заставляя думать, что QDialog - это обычное окно. Чтобы сделать это с помощью класса QDialog, необходимо изменить флаги окна.

Вместо того, чтобы делать все шаги, которые говорит DomTomCat, вы можете обнаружить сеанс, а затем просто

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

Об ошибке сообщалось (и игнорировалось) раньше, но, насколько я знаю, это первый простой обходной путь.

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

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

Ubuntu также может использовать compiz. Это можно увидеть по адресу:

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

С наилучшими пожеланиями,

Икер Де Эчаниз.

Я пришел к методу, который работает. Я не знаю, почему это работает по сравнению с просто звонком showFullScreen(), Я думаю, что это не идеальное и чистое решение. Это, безусловно, может быть адаптировано к другим переменным среды и X сеансам.

    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();
    }

Для восстановления из полноэкранного состояния это сработало

    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();
    }
Другие вопросы по тегам