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

1

Решение

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/*

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

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

4

Другие решения

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

По вопросам рекламы [email protected]