Полноэкранный режим для 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()));
}

person DomTomCat    schedule 28.09.2012    source источник


Ответы (2)


DomTomCat здесь, в stackoverflow, показал способ обнаружения 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/*

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

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

person ideechaniz    schedule 06.06.2014
comment
Спасибо, теперь я смог проверить это, это сработало как шарм - person DomTomCat; 30.12.2015

Я пришел к методу, который работает. Я не знаю, почему это работает по сравнению с простым вызовом 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();
    }
person DomTomCat    schedule 24.03.2013